Qt 操作Json格式文件(创建、插入、解析、修改、删除) | 您所在的位置:网站首页 › json用什么文件打开的最快呢 › Qt 操作Json格式文件(创建、插入、解析、修改、删除) |
花了几天时间研究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项 操作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文件: { } "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 实验室设备网 版权所有 |