C C++最全Qt 操作Json格式文件(创建、插入、解析、修改、删除(1),2024年最新看这篇文章就行了

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

// 获取根 { }
QJsonObject rootObj = doc.object();

  1. 修改属性
// 修改name属性
rootObj["name"] = "老李";
rootObj["vip"] = false;

修改前:
在这里插入图片描述
修改后:
在这里插入图片描述
4. 修改数组 [ ] 中的元素

QJsonValue colorValue = rootObj.value("color");
if (colorValue.type() == QJsonValue::Array) {
	QJsonArray colorArray = colorValue.toArray();

	// 修改数组中的值
	colorArray.replace(0, "blue");
	colorArray.replace(1, "green");

	// 赋值覆盖原有数组属性
	rootObj["color"] = colorArray;
}

修改前:
在这里插入图片描述
修改后:
在这里插入图片描述
5. 修改 { } 中的值

QJsonValue interestValue = rootObj.value("interest");
if (interestValue.type() == QJsonValue::Object) {
	QJsonObject interestObject = interestValue.toObject();

	interestObject["badminton"] = "乒乓球";
	interestObject["basketball"] = "足球";

	rootObj["interest"] = interestObject;
}

修改前:
在这里插入图片描述

修改后:
在这里插入图片描述
6. 修改 { { } } 中的值

QJsonValue languagesValue = rootObj.value("languages");
if (languagesValue.type() == QJsonValue::Object) {
	QJsonObject languagesObj = languagesValue.toObject();

	// 找到内部第一个 { }
	QJsonValue serialOneValue = languagesObj.value("serialOne");
	if (serialOneValue.type() == QJsonValue::Object) {
		QJsonObject serialOneObj = serialOneValue.toObject();

		serialOneObj["grade"] = "20";

		languagesObj["serialOne"] = serialOneObj;
	}

	// 找到内部第二个 { }
	QJsonValue serialTwoValue = languagesObj.value("serialTwo");
	if (serialTwoValue.type() == QJsonValue::Object) {
		QJsonObject serialTwoObj = serialTwoValue.toObject();

		serialTwoObj["grade"] = "10";
		serialTwoObj["language"] = "粤语";

		languagesObj["serialTwo"] = serialTwoObj;
	}

	rootObj["languages"] = languagesObj;
}

修改前:
在这里插入图片描述
修改后:
在这里插入图片描述
7. 修改 [ { } ]

QJsonValue likeValue = rootObj.value("like");
if (likeValue.type() == QJsonValue::Array) {
	QJsonArray likeArray = likeValue.toArray();

	// 根据索引获得对应{ }
	QJsonObject obj1 = likeArray[0].toObject();
	obj1["game"] = "欢乐斗地主";
	obj1["price"] = 88.8;
	QJsonObject obj2 = likeArray[1].toObject();
	obj2["game"] = "欢乐斗牛";
	obj2["price"] = 77.7;

	// 替换覆盖
	likeArray.replace(0, obj1);
	likeArray.replace(1, obj2);

	rootObj["like"] = likeArray;
}

修改前:
在这里插入图片描述
修改后:
在这里插入图片描述
8. 写入文件
最后,再将跟节点对象{ }重新设置给QJsonDocument对象,在重新写入文件即可!

// 将object设置为本文档的主要对象
doc.setObject(rootObj);

// 重写打开文件,覆盖原有文件,达到删除文件全部内容的效果
QFile writeFile("../Json/js.json");
if (!writeFile.open(QFile::WriteOnly | QFile::Truncate)) {
	qDebug() << "can't open error!";
	return;
}

// 将修改后的内容写入文件
QTextStream wirteStream(&writeFile);
wirteStream.setCodec("UTF-8");		// 设置读取编码是UTF8
wirteStream << doc.toJson();		// 写入文件
writeFile.close();					// 关闭文件


五、删除Json

删除跟修改类似的,使用跟节点对象找到对象{}或者数组[]后,使用remove函数指定键参数进行删除!

  1. 读取数据解析成QJsonDocument代码省略,跟上面一样
  2. 获取根节点对象
// 获取根 { }
QJsonObject rootObj = doc.object();

  1. 删除属性
// 删除age
rootObj.remove("age");

  1. 删除数组[]中的元素
QJsonValue colorValue = rootObj.value("color");
if (colorValue.type() == QJsonValue::Array) {
	QJsonArray colorArray = colorValue.toArray();

	// 删除数组中索引为1的值
	colorArray.removeAt(1);

	// 赋值覆盖原有数组属性
	rootObj["color"] = colorArray;
}

删除前:
在这里插入图片描述
删除后:
在这里插入图片描述
5. 删除 { } 中的值

QJsonValue interestValue = rootObj.value("interest");
if (interestValue.type() == QJsonValue::Object) {
	QJsonObject interestObject = interestValue.toObject();

	// 删除键为basketball的属性元素
	interestObject.remove("basketball");

	rootObj["interest"] = interestObject;
}

删除前:
在这里插入图片描述
删除后:
在这里插入图片描述
6. 删除 { { } } 中的值

QJsonValue languagesValue = rootObj.value("languages");
if (languagesValue.type() == QJsonValue::Object) {
	QJsonObject languagesObj = languagesValue.toObject();

	// 删除键为serialTwo的对象 { }
	languagesObj.remove("serialTwo");

	rootObj["languages"] = languagesObj;
}

删除前:
在这里插入图片描述
删除后:
在这里插入图片描述
7. 删除 [ ] 中的 { }

QJsonValue likeValue = rootObj.value("like");
if (likeValue.type() == QJsonValue::Array) {
	QJsonArray likeArray = likeValue.toArray();

	// 删除索引为1数组中的值
	likeArray.removeAt(1);

	rootObj["like"] = likeArray;
}

删除前:
在这里插入图片描述
删除后:
在这里插入图片描述
8. 删除 对象 { } 与 删除 数组 [ ]

// 删除 [ ]
rootObj.remove("color");

// 删除 { }
rootObj.remove("interest");

删除后就没有啦!
9. 写入文件
最后,再将跟节点对象{ }重新设置给QJsonDocument对象,在重新写入文件即可!
与上同,这里就不写下代码了!

六、全部代码

我这代码使用VS2017新建一个QT空项目写出来的!

指定编码
#pragma execution_character_set(“utf-8”) // qt支持显示中文

#include <QCoreApplication>

#include <QJsonObject> // { }
#include <QJsonArray> // [ ]
#include <QJsonDocument> // 解析Json
#include <QJsonValue> // int float double bool null { } [ ]
#include <QJsonParseError>

#include <QDebug>
#include <QFile>
#include <QTextStream>

#pragma execution\_character\_set("utf-8") // qt支持显示中文


// 封装Json
void createJson() {


	/\*
 \* "interest": {
 \* "basketball": "篮球",
 \* "badminton": "羽毛球"
 \* },
 \*/
	// 定义 { } 对象
	QJsonObject interestObj;
	// 插入元素,对应键值对
	interestObj.insert("basketball", "篮球");
	interestObj.insert("badminton", "羽毛球");


	/\*
 \* "color": [ "black", "white"],
 \*/
	// 定义 [ ] 数组
	QJsonArray colorArray;
	// 往数组中添加元素
	colorArray.append("black");
	colorArray.append("white");



	/\*
 \* "like": [
 \* { "game": "三国杀", "price": 58.5 },
 \* { "game": "海岛奇兵", "price": 66.65 }
 \* ],
 \*/
	// 定义 { } 对象
	QJsonObject likeObject1;
	likeObject1.insert("game", "三国杀");
	likeObject1.insert("price", 58.5);

	QJsonObject likeObject2;
	likeObject2.insert("game", "海岛奇兵");
	likeObject2.insert("price", 66.65);

	// 定义 [ ] 对象
	QJsonArray likeArray;
	likeArray.append(likeObject1);
	likeArray.append(likeObject2);



	/\*
 \* "languages": {
 \* "serialOne": { "language": "汉语", "grade": 10 },
 \* "serialTwo": { "language": "英语", "grade": 6 }
 \* },
 \*/
	// 定义 { } 对象
	QJsonObject language1;
	language1.insert("language", "汉语");
	language1.insert("grade", 10);

	QJsonObject language2;
	language2.insert("language", "英语");
	language2.insert("grade", 6);

	QJsonObject languages;
	// 将{ } 插入 { } 中
	languages.insert("serialOne", language1);
	languages.insert("serialTwo", language2);



	// 定义根节点 也即是最外层 { }
	QJsonObject rootObject;

	// 插入元素
	rootObject.insert("name", "老王");
	rootObject.insert("age", 26);
	rootObject.insert("interest", interestObj);
	rootObject.insert("color", colorArray);
	rootObject.insert("like", likeArray);
	rootObject.insert("languages", languages);
	rootObject.insert("vip", true);
	rootObject.insert("address", QJsonValue::Null);


	// 将json对象里的数据转换为字符串
	QJsonDocument doc;
	// 将object设置为本文档的主要对象
	doc.setObject(rootObject);


	// Json字符串保存到json文件里
	QFile file("../Json/js.json");
	if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
		qDebug() << "can't open error!";
		return;

	}

	QTextStream stream(&file);
	stream.setCodec("UTF-8");		// 设置写入编码是UTF8
	// 写入文件
	stream << doc.toJson();
	file.close();
}


// 解析Json
void analysisJson() {
	QFile file("../Json/js.json");
	if (!file.open(QFile::ReadOnly | QFile::Text)) {
		qDebug() << "can't open error!";
		return;
	}

	// 读取文件的全部内容
	QTextStream stream(&file);
	stream.setCodec("UTF-8");		// 设置读取编码是UTF8
	QString str = stream.readAll();
	
	file.close();

	/\* 解析Json \*/

	// QJsonParseError类用于在JSON解析期间报告错误。
	QJsonParseError jsonError;
	// 将json解析为UTF-8编码的json文档,并从中创建一个QJsonDocument。
	// 如果解析成功,返回QJsonDocument对象,否则返回null
	QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8(), &jsonError);
	// 判断是否解析失败
	if (jsonError.error != QJsonParseError::NoError && !doc.isNull()) {
		qDebug() << "Json格式错误!" << jsonError.error;
		return;
	}

	// 获取根 { }
	QJsonObject rootObj = doc.object();


	// 根据键获取值
	QJsonValue nameValue = rootObj.value("name");
	qDebug() << "name = " << nameValue.toString();


	QJsonValue ageValue = rootObj.value("age");
	qDebug() << "age = " << ageValue.toInt();



	// 解析对象 { }
	QJsonValue interestValue = rootObj.value("interest");
	// 判断是否是object类型
	if (interestValue.type() == QJsonValue::Object) {
		// 转换为QJsonObject类型
		QJsonObject interestObj = interestValue.toObject();

		QJsonValue basketballValue = interestObj.value("basketball");
		qDebug() << "basketball = " << basketballValue.toString();
		QJsonValue badmintonValue = interestObj.value("badminton");
		qDebug() << "badminton = " << badmintonValue.toString();
	}


	// 解析数组 [ ]
	QJsonValue colorValue = rootObj.value("color");
	// 判断是否是Array类型
	if (colorValue.type() == QJsonValue::Array) {
		// 转换为QJsonArray类型
		QJsonArray colorArray = colorValue.toArray();

		for (int i = 0; i < colorArray.size(); i++) {
			QJsonValue color = colorArray.at(i);
			qDebug() << "color = " << color.toString();
		}
	}


	// 解析数组中的对象 [ { } ]
	QJsonValue likeValue = rootObj.value("like");
	if (likeValue.type() == QJsonValue::Array) {
		QJsonArray likeArray = likeValue.toArray();

		for (int i = 0; i < likeArray.count(); i++) {
			QJsonValue likeValueChild = likeArray.at(i);

			if (likeValueChild.type() == QJsonValue::Object) {
				QJsonObject likeObj = likeValueChild.toObject();

				QJsonValue gameLikeValue = likeObj.value("game");
				qDebug() << "game = " << gameLikeValue.toString();
				QJsonValue priceLikeValue = likeObj.value("price");
				qDebug() << "price = " << priceLikeValue.toDouble();
			}
		}
	}




	// 解析 对象 中 对象 { { } }
	QJsonValue languagesValue = rootObj.value("languages");
	if (languagesValue.type() == QJsonValue::Object) {
		QJsonObject languagesObj = languagesValue.toObject();

		QJsonValue serialOneValue = languagesObj.value("serialOne");
		if (serialOneValue.type() == QJsonValue::Object) {
			QJsonObject serialOneObj = serialOneValue.toObject();

			QJsonValue languageValue = serialOneObj.value("language");
			qDebug() << "language = " << languageValue.toString();
			QJsonValue gradeValue = serialOneObj.value("grade");
			qDebug() << "grade = " << gradeValue.toInt();
		}

		QJsonValue serialTwoValue = languagesObj.value("serialTwo");
		if (serialTwoValue.type() == QJsonValue::Object) {
			QJsonObject serialTwoObj = serialTwoValue.toObject();

			QJsonValue languageValue = serialTwoObj.value("language");
			qDebug() << "language = " << languageValue.toString();
			QJsonValue gradeValue = serialTwoObj.value("grade");
			qDebug() << "grade = " << gradeValue.toInt();
		}
	}


	// 解析 bool类型
	QJsonValue vipValue = rootObj.value("vip");
	qDebug() << "vip = " << vipValue.toBool();


	// 解析 null类型
	QJsonValue addressValue = rootObj.value("address");
	if (addressValue.type() == QJsonValue::Null) {
		qDebug() << "address = " << "null";
	}

}


// 修改Json数据
void alterJson() {
	/\* 修改也就再重写写一遍覆盖掉就行 \*/

	QFile readFile("../Json/js.json");
	if (!readFile.open(QFile::ReadOnly | QFile::Truncate)) {
		qDebug() << "can't open error!";
		return;
	}

	// 读取文件的全部内容
	QTextStream readStream(&readFile);
	readStream.setCodec("UTF-8");		// 设置读取编码是UTF8
	QString str = readStream.readAll();
	readFile.close();

	/\* 修改Json \*/

	// QJsonParseError类用于在JSON解析期间报告错误。
	QJsonParseError jsonError;
	// 将json解析为UTF-8编码的json文档,并从中创建一个QJsonDocument。
	// 如果解析成功,返回QJsonDocument对象,否则返回null
	QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8(), &jsonError);
	if (jsonError.error != QJsonParseError::NoError && !doc.isNull()) {
		qDebug() << "Json格式错误!" << jsonError.error;
		return;
	}

	// 获取根 { }
	QJsonObject rootObj = doc.object();

	// 修改name属性
	rootObj["name"] = "老李";
	rootObj["vip"] = false;


	// 修改数组[]中的元素
	QJsonValue colorValue = rootObj.value("color");
	if (colorValue.type() == QJsonValue::Array) {
		QJsonArray colorArray = colorValue.toArray();

		// 修改数组中的值
		colorArray.replace(0, "blue");
		colorArray.replace(1, "green");

		// 赋值覆盖原有数组属性
		rootObj["color"] = colorArray;
	}



	// 修改 { } 中的值
	QJsonValue interestValue = rootObj.value("interest");
	if (interestValue.type() == QJsonValue::Object) {
		QJsonObject interestObject = interestValue.toObject();

		interestObject["badminton"] = "乒乓球";
		interestObject["basketball"] = "足球";

		rootObj["interest"] = interestObject;
	}

	
	// 修改 { { } } 中的值
	QJsonValue languagesValue = rootObj.value("languages");
	if (languagesValue.type() == QJsonValue::Object) {
		QJsonObject languagesObj = languagesValue.toObject();

		// 找到内部第一个 { }
		QJsonValue serialOneValue = languagesObj.value("serialOne");
		if (serialOneValue.type() == QJsonValue::Object) {
			QJsonObject serialOneObj = serialOneValue.toObject();

			serialOneObj["grade"] = "20";

			languagesObj["serialOne"] = serialOneObj;
		}

		// 找到内部第二个 { }
		QJsonValue serialTwoValue = languagesObj.value("serialTwo");
		if (serialTwoValue.type() == QJsonValue::Object) {
			QJsonObject serialTwoObj = serialTwoValue.toObject();

			serialTwoObj["grade"] = "10";
			serialTwoObj["language"] = "粤语";

			languagesObj["serialTwo"] = serialTwoObj;
		}

		rootObj["languages"] = languagesObj;
	}



	// 修改 [ { } ] 
	QJsonValue likeValue = rootObj.value("like");
	if (likeValue.type() == QJsonValue::Array) {
		QJsonArray likeArray = likeValue.toArray();

		// 根据索引获得对应{ }
		QJsonObject obj1 = likeArray[0].toObject();
		obj1["game"] = "欢乐斗地主";
		obj1["price"] = 88.8;
		QJsonObject obj2 = likeArray[1].toObject();
		obj2["game"] = "欢乐斗牛";
		obj2["price"] = 77.7;

		// 替换覆盖
		likeArray.replace(0, obj1);
		likeArray.replace(1, obj2);

		rootObj["like"] = likeArray;
	}


	// 将object设置为本文档的主要对象
	doc.setObject(rootObj);

	// 重写打开文件,覆盖原有文件,达到删除文件全部内容的效果
	QFile writeFile("../Json/js.json");
	if (!writeFile.open(QFile::WriteOnly | QFile::Truncate)) {
		qDebug() << "can't open error!";
		return;
	}

	// 将修改后的内容写入文件
	QTextStream wirteStream(&writeFile);
	wirteStream.setCodec("UTF-8");		// 设置读取编码是UTF8
	wirteStream << doc.toJson();		// 写入文件
	writeFile.close();					// 关闭文件
}


// 删除Json
void delJson() {
	QFile readFile("../Json/js.json");
	if (!readFile.open(QFile::ReadOnly | QFile::Truncate)) {
		qDebug() << "can't open error!";
		return;
	}

	// 读取文件的全部内容
	QTextStream readStream(&readFile);
	readStream.setCodec("UTF-8");		// 设置读取编码是UTF8
	QString str = readStream.readAll();
	readFile.close();

	/\* 修改Json \*/

	// QJsonParseError类用于在JSON解析期间报告错误。
	QJsonParseError jsonError;
	// 将json解析为UTF-8编码的json文档,并从中创建一个QJsonDocument。
	// 如果解析成功,返回QJsonDocument对象,否则返回null
	QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8(), &jsonError);
	if (jsonError.error != QJsonParseError::NoError && !doc.isNull()) {
		qDebug() << "Json格式错误!" << jsonError.error;
		return;
	}

	// 获取根 { }
	QJsonObject rootObj = doc.object();


	// 删除age
	rootObj.remove("age");


	// 删除数组[]中的元素
	QJsonValue colorValue = rootObj.value("color");
	if (colorValue.type() == QJsonValue::Array) {
		QJsonArray colorArray = colorValue.toArray();

		// 删除数组中索引为1的值
		colorArray.removeAt(1);

		// 赋值覆盖原有数组属性
		rootObj["color"] = colorArray;
	}




	// 删除 { } 中的值
	QJsonValue interestValue = rootObj.value("interest");
	if (interestValue.type() == QJsonValue::Object) {
		QJsonObject interestObject = interestValue.toObject();

		// 删除键为basketball的属性元素
		interestObject.remove("basketball");

		rootObj["interest"] = interestObject;
	}



	// 删除 { { } } 中的值
	QJsonValue languagesValue = rootObj.value("languages");
	if (languagesValue.type() == QJsonValue::Object) {
		QJsonObject languagesObj = languagesValue.toObject();

		// 删除键为serialTwo的对象 { }
		languagesObj.remove("serialTwo");

		rootObj["languages"] = languagesObj;
	}



	// 删除 [ ] 中的 { }
	QJsonValue likeValue = rootObj.value("like");
	if (likeValue.type() == QJsonValue::Array) {
		QJsonArray likeArray = likeValue.toArray();

		// 删除索引为1数组中的值
		likeArray.removeAt(1);

		rootObj["like"] = likeArray;
	}



	// 删除 [ ]
	rootObj.remove("color");

	// 删除 { }
	rootObj.remove("interest");



	// 将object设置为本文档的主要对象
	doc.setObject(rootObj);

	// 重写打开文件,覆盖原有文件,达到删除文件全部内容的效果
	QFile writeFile("../Json/js.json");
	if (!writeFile.open(QFile::WriteOnly | QFile::Truncate)) {
		qDebug() << "can't open error!";
		return;
	}

	// 将修改后的内容写入文件
	QTextStream wirteStream(&writeFile);
	wirteStream.setCodec("UTF-8");		// 设置读取编码是UTF8
	wirteStream << doc.toJson();		// 写入文件
	writeFile.close();					// 关闭文件
}



int main(int argc, char \*argv[]) {
	QCoreApplication a(argc, argv);

	createJson();

	analysisJson();

	alterJson();

	delJson();

	return a.exec();
}


七、总结

可能讲的不是很清楚,很多细节没有详细的描述。但是该有的操作都已经用代码操作出来了,可以根据自己的项目需求进行截取观看理解,不懂的在评论区留言,我再帮你解答吧,我尽力了!

另外,真的,真的,真的需要注意编码统一的问题,我在写解析时,就是没有考虑到编码问题,导致我找中文乱码问题找了两天,最后还是请教网上的大佬才解决,太郁闷了!(记得写入文件是什么格式,读取出来就得是什么格式,还有,由于我在代码开头就指定了编码是UTF-8,所以我写入文件和读取文件,都是指定了UTF-8格式,这样才不会出现中文乱码的情况!)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

writeFile.close();					// 关闭文件

}

int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);

createJson();

analysisJson();

alterJson();

delJson();

return a.exec();

}




---


## 七、总结


可能讲的不是很清楚,很多细节没有详细的描述。但是该有的操作都已经用代码操作出来了,可以根据自己的项目需求进行截取观看理解,不懂的在评论区留言,我再帮你解答吧,我尽力了!


另外,真的,真的,真的需要注意编码统一的问题,我在写解析时,就是没有考虑到编码问题,导致我找中文乱码问题找了两天,最后还是请教网上的大佬才解决,太郁闷了!(记得写入文件是什么格式,读取出来就得是什么格式,还有,由于我在代码开头就指定了编码是UTF-8,所以我写入文件和读取文件,都是指定了UTF-8格式,这样才不会出现中文乱码的情况!)





[外链图片转存中...(img-8c8cvW6H-1715696795190)]
[外链图片转存中...(img-Yyo12zqq-1715696795191)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 23
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值