Qt 操作Json格式文件(创建、插入、解析、修改、删除) 您所在的位置:网站首页 json用什么文件打开的最快呢 Qt 操作Json格式文件(创建、插入、解析、修改、删除)

Qt 操作Json格式文件(创建、插入、解析、修改、删除)

2024-07-11 20:21| 来源: 网络整理| 查看: 265

花了几天时间研究Qt如何操作Json文件,也是有一点心得,现在记录下来分享!

为什么要学习Json呢?Json是一个轻量级数据存储文件,其里面使用了大量的字符进行存储数据。JSON 是存储和交换文本信息的语法,类似 XML。JSON 比 XML 更小、更快,更易解析。

JSON 是一种编码来自 Javascript 的对象数据的格式,但现在已广泛用作互联网上的数据交换格式。 Qt 中的 JSON 支持提供了易于使用的C++ API 来解析、修改和保存 JSON 数据。

当然,我学习Json,主要是因为我的上一篇博客中学习了Qt的Socket编程,个人觉得,如果是需要在TCP与UDP进行数据传送的话,使用Json文件传输效率会比较高吧…个人理解,不喜勿喷!

所以呢,今天带来一篇,使用Qt操作Json格式文件的博客,供大家参考、借鉴!

目录 一、准备工作二、封装Json三、解析Json四、修改Json五、删除Json六、全部代码七、总结

一、准备工作

VS编译器创建项目时,勾选Core项 在这里插入图片描述 QT编译器需要在.pro文件中 QT += Core

操作Json文件所需要用到的类:

类类说明QJsonDocument读写JSON文档QJsonObject封装JSON对象 { }QJsonArray封装JSON数组 [ ]QJsonValue封装JSON值 int,float,double,bool,{ },[ ]等QJsonParseError报告JSON处理过程中出现的错误

操作Json文件所需要用到的头文件: #include < QJsonObject > // { } #include < QJsonArray > // [ ] #include < QJsonDocument > // 解析Json #include < QJsonValue > // int float double bool null { } [ ] #include < QJsonParseError >

下图是这篇博客所操作的JSON文件: 在这里插入图片描述

二、封装Json

{ }

"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);

实例化QJsonDocument对象

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

Json字符串保存到json文件里

QFile file("../Json/js.json"); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { qDebug() qDebug() // 转换为QJsonObject类型 QJsonObject interestObj = interestValue.toObject(); QJsonValue basketballValue = interestObj.value("basketball"); qDebug() QJsonValue color = colorArray.at(i); qDebug() // 获取数组的第一个元素,类型是QJsonValue QJsonValue likeValueChild = likeArray.at(i); // 判断是不是对象类型 if (likeValueChild.type() == QJsonValue::Object) { // 转换成对象类型 QJsonObject likeObj = likeValueChild.toObject(); // 最后通过value函数就可以获取到值了,解析成功! QJsonValue gameLikeValue = likeObj.value("game"); qDebug() // 转换成对象类型 QJsonObject serialOneObj = serialOneValue.toObject(); // 根据建获取值 QJsonValue languageValue = serialOneObj.value("language"); // 最后转换成对应类型就解析出来了! qDebug() // 转换成数组类型 QJsonArray colorArray = colorValue.toArray(); // 遍历数组 for (int i = 0; i // 转换成数组类型 QJsonArray colorArr = colorValueChild.toArray(); for (int i = 0; i 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; }

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

写入文件 最后,再将跟节点对象{ }重新设置给QJsonDocument对象,在重新写入文件即可!

// 将object设置为本文档的主要对象 doc.setObject(rootObj); // 重写打开文件,覆盖原有文件,达到删除文件全部内容的效果 QFile writeFile("../Json/js.json"); if (!writeFile.open(QFile::WriteOnly | QFile::Truncate)) { qDebug() 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");

删除后就没有啦!

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

六、全部代码

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

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

#include #include // { } #include // [ ] #include // 解析Json #include // int float double bool null { } [ ] #include #include #include #include #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() qDebug() // 转换为QJsonObject类型 QJsonObject interestObj = interestValue.toObject(); QJsonValue basketballValue = interestObj.value("basketball"); qDebug() QJsonValue color = colorArray.at(i); qDebug() QJsonValue likeValueChild = likeArray.at(i); if (likeValueChild.type() == QJsonValue::Object) { QJsonObject likeObj = likeValueChild.toObject(); QJsonValue gameLikeValue = likeObj.value("game"); qDebug() QJsonObject serialOneObj = serialOneValue.toObject(); QJsonValue languageValue = serialOneObj.value("language"); qDebug() qDebug() qDebug() 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() qDebug() 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()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有