文章介绍
- 本文章主要介绍如何使用QT提供的json相关类来处理json数据,包括json数据的生成、解析、修改和json数据的删除。
json数据的增删改查
- 处理json数据时需要包含以下三个头文件
-
#include <QJsonDocument>#include <QJsonObject>#include <QJsonArray>
-
json数据生成
- json数据
-
{ "id":1001,"name":"jack","sex":true}
-
- 代码
-
// 创建json数据对象QJsonObject json;json.insert("name", "jack");json.insert("id", 1001);json.insert("sex", true);QJsonDocument document; // 创建json文档document.setObject(json); // 给json文档设置json数据对象// 将json数据对象转为字符串QByteArray byJsonData = document.toJson(QJsonDocument::Compact);QString strJson(byJsonData);
-
嵌套json数据生成
- json数据
-
{"id": 1002,"name": "Tom","scoreData":{"Chinese":96,"English":82,"Math":90},"sex":true}
-
- 代码
-
// 创建子节点scoreData的json数据对象QJsonObject scoreObject;scoreObject.insert("Math", 90);scoreObject.insert("Chinese", 96);scoreObject.insert("English", 82);// 创建json数据对象QJsonObject json;json.insert("name", "Tom");json.insert("id", 1002);json.insert("sex", true);json.insert("scoreData", QJsonValue(scoreObject));QJsonDocument document;document.setObject(json);QByteArray byJsonData = document.toJson(QJsonDocument::Compact);QString strJson(byJsonData);
-
包含数组的json数据生成
- json数据
-
{"id":1002,"name": "Tom","scoreData":{"Chinese":96,"English":82,"Math":90},"sex": true,"techData":["C++", "JAVA", "PYTHON"]}
-
- 代码
-
// 创建json数组对象QJsonArray techArray;techArray.append("C++");techArray.append("JAVA");techArray.append("PYTHON");// 创建子节点scoreData的json数据对象QJsonObject scoreObject;scoreObject.insert("Math", 90);scoreObject.insert("Chinese", 96);scoreObject.insert("English", 82);// 创建json对象QJsonObject json;json.insert("name", "Tom");json.insert("id", 1002);json.insert("sex", true);json.insert("scoreData", QJsonValue(scoreObject));json.insert("techData", QJsonValue(techArray));QJsonDocument document;document.setObject(json);QByteArray byJsonData = document.toJson(QJsonDocument::Compact);QString strJson(byJsonData);
-
包含数组对象的json数据生成
- json数据
-
{"id":1002,"name": "Tom","schoolData":[{"schoolCity":"Xian","schoolName":"xiaoxue"},{"schoolCity":"Xian","schoolName":"zhongxue"},{"schoolCity":"Beijing","schoolName":"daxue"}],"scoreData":{"Chinese":96,"English":82,"Math":90},"sex":true}
-
- 代码
-
// 创建json数组QJsonArray SchoolArray;QJsonObject primarySchoolObj;primarySchoolObj.insert("schoolName", "xiaoxue");primarySchoolObj.insert("schoolCity", "Xian");QJsonObject middleSchoolObj;middleSchoolObj.insert("schoolName", "zhongxue");middleSchoolObj.insert("schoolCity", "Xian");QJsonObject universityObj;universityObj.insert("schoolName", "daxue");universityObj.insert("schoolCity", "Beijing");// json数组中插入json数据对象SchoolArray.append(primarySchoolObj);SchoolArray.append(middleSchoolObj);SchoolArray.append(universityObj);// 创建子节点scoreData的json数据对象QJsonObject scoreObject;scoreObject.insert("Math", 90);scoreObject.insert("Chinese", 96);scoreObject.insert("English", 82);// 创建json数据QJsonObject json;json.insert("name", "Tom");json.insert("id", 1002);json.insert("sex", true);json.insert("scoreData", QJsonValue(scoreObject));json.insert("schoolData", QJsonValue(SchoolArray));QJsonDocument document;document.setObject(json);QByteArray byJsonData = document.toJson(QJsonDocument::Compact);QString strJson(byJsonData);
-
json数据解析
- json数据
-
{"sex":true,"id":1001,"name":"jack"}
-
- 解析结果
-
strName "jack"iId 1001bSex true
-
- 代码
-
QByteArray jsonData = "{\"sex\":true,\"id\":1001,\"name\":\"jack\"}";// 将字符串转为json文档QJsonParseError result;QJsonDocument rootDoc = QJsonDocument::fromJson(jsonData, &result);if(rootDoc.isNull() || result.error != QJsonParseError::NoError){qDebug() << "parse json data failed.";return false;}// 获取根对象QJsonObject rootObj = rootDoc.object();// 解析json数据QJsonValue nameValue = rootObj.value("name");QString strName = nameValue.toString();qDebug() << "strName" << strName;QJsonValue idValue = rootObj.value("id");int iId = idValue.toInt();qDebug() << "iId" << iId;QJsonValue sexValue = rootObj.value("sex");bool bSex = sexValue.toBool();qDebug() << "bSex" << bSex;
-
嵌套json数据解析
- json数据
-
{"id":1002,"name":"Tom","scoreData":{"Chinese":96,"English":82,"Math":90},"sex":true}
-
- 解析结果
-
strName "Tom"iId 1002bSex trueiChinese 96iEnglish 82iMath 90
-
- 代码
-
QByteArray jsonData = "{\"id\":1002,\"name\":\"Tom\",\"scoreData\":{\"Chinese\":96,\"English\":82,\"Math\":90},\"sex\":true}";QJsonParseError result;QJsonDocument rootDoc = QJsonDocument::fromJson(jsonData, &result);if(rootDoc.isNull() || result.error != QJsonParseError::NoError){qDebug() << "parse json data failed.";return false;}// 获取根对象QJsonObject rootObj = rootDoc.object();// 解析json数据QJsonValue nameValue = rootObj.value("name");QString strName = nameValue.toString();qDebug() << "strName" << strName;QJsonValue idValue = rootObj.value("id");int iId = idValue.toInt();qDebug() << "iId" << iId;QJsonValue sexValue = rootObj.value("sex");bool bSex = sexValue.toBool();qDebug() << "bSex" << bSex;// 解析scoreData节点的json数据QJsonValue scoreDataValue = rootObj.value("scoreData");QJsonObject scoreDataObj = scoreDataValue.toObject();QJsonValue chineseValue = scoreDataObj.value("Chinese");int iChinese = chineseValue.toInt();qDebug() << "iChinese" << iChinese;QJsonValue englishValue = scoreDataObj.value("English");int iEnglish = englishValue.toInt();qDebug() << "iEnglish" << iEnglish;QJsonValue mathValue = scoreDataObj.value("Math");int iMath = mathValue.toInt();qDebug() << "iMath" << iMath;
-
包含数组的json数据解析
- json数据
-
{"id":1002,"name":"Tom","scoreData":{"Chinese":96,"English":82,"Math":90},"sex":true,"techData":["C++", "JAVA", "PYTHON"]}
-
- 解析结果
-
strName "Tom"iId 1002bSex trueiChinese 96iEnglish 82iMath 90str "C++"str "JAVA"str "PYTHON"
-
- 代码
-
QByteArray jsonData = "{\"id\":1002,\"name\":\"Tom\",\"scoreData\":{\"Chinese\":96,\"English\":82,\"Math\":90},\"sex\":true,\"techData\":[\"C++\",\"JAVA\",\"PYTHON\"]}";QJsonParseError result;QJsonDocument rootDoc = QJsonDocument::fromJson(jsonData, &result);if(rootDoc.isNull() || result.error != QJsonParseError::NoError){qDebug() << "parse json data failed.";return false;}// 获取根对象QJsonObject rootObj = rootDoc.object();// 解析json数据QJsonValue nameValue = rootObj.value("name");QString strName = nameValue.toString();qDebug() << "strName" << strName;QJsonValue idValue = rootObj.value("id");int iId = idValue.toInt();qDebug() << "iId" << iId;QJsonValue sexValue = rootObj.value("sex");bool bSex = sexValue.toBool();qDebug() << "bSex" << bSex;// 解析scoreData节点的json数据QJsonValue scoreDataValue = rootObj.value("scoreData");QJsonObject scoreDataObj = scoreDataValue.toObject();QJsonValue chineseValue = scoreDataObj.value("Chinese");int iChinese = chineseValue.toInt();qDebug() << "iChinese" << iChinese;QJsonValue englishValue = scoreDataObj.value("English");int iEnglish = englishValue.toInt();qDebug() << "iEnglish" << iEnglish;QJsonValue mathValue = scoreDataObj.value("Math");int iMath = mathValue.toInt();qDebug() << "iMath" << iMath;// 解析techData数组中的json数据QJsonValue techDataValue = rootObj.value("techData");QJsonArray techDataArray = techDataValue.toArray();for(int i = 0; i < techDataArray.size(); i++){QJsonValue value = techDataArray.at(i);QString str = value.toString();qDebug() << "str" << str;}
-
包含数组对象的json数据解析
- json数据
-
{"id":1002,"name":"Tom","schoolData":[{"schoolCity":"Xian","schoolName":"xiaoxue"},{"schoolCity":"Xian","schoolName":"zhongxue"},{"schoolCity":"Beijing","schoolName":"daxue"}],"scoreData":{"Chinese":96,"English":82,"Math":90},"sex":true}
-
- 解析结果
-
strName "Tom"iId 1002bSex trueiChinese 96iEnglish 82iMath 90strSchoolname "xiaoxue"strSchoolcity "Xian"strSchoolname "zhongxue"strSchoolcity "Xian"strSchoolname "daxue"strSchoolcity "Beijing"
-
- 代码
-
QByteArray jsonData = "{\"id\":1002,\"name\":\"Tom\",\"schoolData\":[{\"schoolCity\":\"Xian\",\"schoolName\":\"xiaoxue\"},{\"schoolCity\":\"Xian\",\"schoolName\":\"zhongxue\"},{\"schoolCity\":\"Beijing\",\"schoolName\":\"daxue\"}],\"scoreData\":{\"Chinese\":96,\"English\":82,\"Math\":90},\"sex\":true}";QJsonParseError result;QJsonDocument rootDoc = QJsonDocument::fromJson(jsonData, &result);if(rootDoc.isNull() || result.error != QJsonParseError::NoError){qDebug() << "parse json data failed.";return false;}// 获取根对象QJsonObject rootObj = rootDoc.object();// 解析json数据QJsonValue nameValue = rootObj.value("name");QString strName = nameValue.toString();qDebug() << "strName" << strName;QJsonValue idValue = rootObj.value("id");int iId = idValue.toInt();qDebug() << "iId" << iId;QJsonValue sexValue = rootObj.value("sex");bool bSex = sexValue.toBool();qDebug() << "bSex" << bSex;// 解析scoreData节点的json数据QJsonValue scoreDataValue = rootObj.value("scoreData");QJsonObject scoreDataObj = scoreDataValue.toObject();QJsonValue chineseValue = scoreDataObj.value("Chinese");int iChinese = chineseValue.toInt();qDebug() << "iChinese" << iChinese;QJsonValue englishValue = scoreDataObj.value("English");int iEnglish = englishValue.toInt();qDebug() << "iEnglish" << iEnglish;QJsonValue mathValue = scoreDataObj.value("Math");int iMath = mathValue.toInt();qDebug() << "iMath" << iMath;// 解析schoolData数组对象的json数据QJsonValue schoolDataValue = rootObj.value("schoolData");QJsonArray schoolDataValueArray = schoolDataValue.toArray();for(int i = 0; i < schoolDataValueArray.size(); i++){QJsonValue value = schoolDataValueArray.at(i);QJsonObject obj = value.toObject();QJsonValue schoolnameValue = obj.value("schoolName");QString strSchoolname = schoolnameValue.toString();qDebug() << "strSchoolname" << strSchoolname;QJsonValue schoolcityValue = obj.value("schoolCity");QString strSchoolcity = schoolcityValue.toString();qDebug() << "strSchoolcity" << strSchoolcity;}
-
json数据修改
- 原始json数据
-
{"id":1002,"name":"Tom","techData":["C++","JAVA","PYTHON"], "schoolData":[{"schoolCity":"Xian","schoolName":"xiaoxue"},{"schoolCity":"Xian","schoolName":"zhongxue"},{"schoolCity":"Beijing","schoolName":"daxue"}],"scoreData":{"Chinese":96,"English":82,"Math":90},"sex":true}
-
- 修改后的json数据
-
{"id":1002,"name":"Jack", // Tom修改为Jack"techData":["C++","JAVA","GO"], // PYTHON修改为GO "schoolData":[{"schoolCity":"Baoji","schoolName":"xiaoxue"}, // Xian改为Baoji{"schoolCity":"Xian","schoolName":"zhongxue"},{"schoolCity":"Beijing","schoolName":"daxue"}],"scoreData":{"Chinese":100, // 96修改为100"English":82,"Math":90},"sex":true}
-
- 代码
-
QByteArray jsonData = "{\"id\":1002,\"name\":\"Tom\",\"techData\":[\"C++\",\"JAVA\",\"PYTHON\"], \"schoolData\":[{\"schoolCity\":\"Xian\",\"schoolName\":\"xiaoxue\"},{\"schoolCity\":\"Xian\",\"schoolName\":\"zhongxue\"},{\"schoolCity\":\"Beijing\",\"schoolName\":\"daxue\"}],\"scoreData\":{\"Chinese\":96,\"English\":82,\"Math\":90},\"sex\":true}";// 将json数据转为json文档QJsonParseError result;QJsonDocument rootDoc = QJsonDocument::fromJson(jsonData, &result);if(rootDoc.isNull() || result.error != QJsonParseError::NoError){qDebug() << "parse json data failed.";return false;}// 获取根对象QJsonObject rootObj = rootDoc.object();// 修改数据rootObj["name"] = "Jack";// 修改数据对象QJsonValue scoreDataValue = rootObj.value("scoreData");QJsonObject scoreDataObj = scoreDataValue.toObject();scoreDataObj["Chinese"] = 100;rootObj["scoreData"] = scoreDataObj;// 修改数组QJsonValue techDataValue = rootObj.value("techData");QJsonArray techDataArray = techDataValue.toArray();for(int i = 0; i < techDataArray.size(); i++){if(techDataArray.at(i).toString().compare("PYTHON") == 0){techDataArray.replace(i, "GO");break;}}rootObj["techData"] = techDataArray;// 修改数组对象QJsonValue schoolDataValue = rootObj.value("schoolData");QJsonArray schoolDataArray = schoolDataValue.toArray();for(int i = 0; i < schoolDataArray.size(); i++){QJsonObject obj = schoolDataArray.at(i).toObject();if(obj.value("schoolName").toString().compare("xiaoxue") == 0){obj["schoolCity"] = "Baoji";schoolDataArray.replace(i, obj);break;}}rootObj["schoolData"] = schoolDataArray;// 将json数据对象转为字符串QJsonDocument document;document.setObject(rootObj);QByteArray byJsonData = document.toJson(QJsonDocument::Compact);QString strJson(byJsonData);
-
新增json数据
- 原始json数据
-
{"id":1002,"name":"Tom","techData":["C++", "JAVA", "PYTHON"], "schoolData":[{"schoolCity":"Xian","schoolName":"xiaoxue"},{"schoolCity":"Xian","schoolName":"zhongxue"},{"schoolCity":"Beijing","schoolName":"daxue"}],"scoreData":{"Chinese":96,"English":82,"Math":90},"sex":true}
-
- 新增相应字段后的json数据
-
{"class":5, // 新增项"home":{ // 新增项"father":52,"mather":52},"id":1002,"name":"Tom","schoolData":[{"schoolCity":"Xian","schoolName":"xiaoxue"},{"schoolCity":"Xian","schoolName":"zhongxue"},{"schoolCity":"Beijing","schoolName":"daxue"},{"schoolCity":"shanghai","schoolName":"boshi"} // 新增项],"scoreData":{"Chinese":96,"English":82,"Math":90,"Physics":100 // 新增项},"sex":true,"techData":["C++","JAVA","PYTHON","GO"] //新增GO数据}
-
- 代码
-
QByteArray jsonData = "{\"id\":1002,\"name\":\"Tom\",\"techData\":[\"C++\",\"JAVA\",\"PYTHON\"], \"schoolData\":[{\"schoolCity\":\"Xian\",\"schoolName\":\"xiaoxue\"},{\"schoolCity\":\"Xian\",\"schoolName\":\"zhongxue\"},{\"schoolCity\":\"Beijing\",\"schoolName\":\"daxue\"}],\"scoreData\":{\"Chinese\":96,\"English\":82,\"Math\":90},\"sex\":true}";QJsonParseError result;QJsonDocument rootDoc = QJsonDocument::fromJson(jsonData, &result);if(rootDoc.isNull() || result.error != QJsonParseError::NoError){qDebug() << "parse json data failed.";return false;}QJsonObject rootObj = rootDoc.object();// 新增数据rootObj.insert("class", 5);// 新增数据对象QJsonObject homeObject;homeObject.insert("father", 52);homeObject.insert("mather", 52);rootObj.insert("home", homeObject);// 在数据对象中新增数据QJsonValue scoreDataValue = rootObj.value("scoreData");QJsonObject scoreDataObj = scoreDataValue.toObject();scoreDataObj.insert("Physics", 100);rootObj["scoreData"] = scoreDataObj;// 在数组中新增数据QJsonValue techDataValue = rootObj.value("techData");QJsonArray techDataArray = techDataValue.toArray();techDataArray.append("GO");rootObj["techData"] = techDataArray;// 在数组对象中新增数据QJsonValue schoolDataValue = rootObj.value("schoolData");QJsonArray schoolDataArray = schoolDataValue.toArray();QJsonObject doctorObj;doctorObj.insert("schoolName", "boshi");doctorObj.insert("schoolCity", "shanghai");schoolDataArray.append(doctorObj);rootObj["schoolData"] = schoolDataArray;QJsonDocument document;document.setObject(rootObj);QByteArray byJsonData = document.toJson(QJsonDocument::Compact);QString strJson(byJsonData);
-
删除json数据
- 原始json数据
-
{"id":1002,"name":"Tom", //此项删除"techData":["C++","JAVA","PYTHON"], // PYTHON删除 "schoolData":[{"schoolCity":"Xian","schoolName":"xiaoxue"}, // 此项删除{"schoolCity":"Xian","schoolName":"zhongxue"},{"schoolCity":"Beijing","schoolName":"daxue"}],"scoreData":{"Chinese":96, //此项删除"English":82,"Math":90},"sex":true}
-
- 删除相应字段后的json数据
-
{"id":1002,"techData":["C++","JAVA"], "schoolData":[{"schoolCity":"Xian","schoolName":"zhongxue"},{"schoolCity":"Beijing","schoolName":"daxue"}],"scoreData":{"English":82,"Math":90},"sex":true}
-
- 代码
-
QByteArray jsonData = "{\"id\":1002,\"name\":\"Tom\",\"techData\":[\"C++\",\"JAVA\",\"PYTHON\"], \"schoolData\":[{\"schoolCity\":\"Xian\",\"schoolName\":\"xiaoxue\"},{\"schoolCity\":\"Xian\",\"schoolName\":\"zhongxue\"},{\"schoolCity\":\"Beijing\",\"schoolName\":\"daxue\"}],\"scoreData\":{\"Chinese\":96,\"English\":82,\"Math\":90},\"sex\":true}";QJsonParseError result;QJsonDocument rootDoc = QJsonDocument::fromJson(jsonData, &result);if(rootDoc.isNull() || result.error != QJsonParseError::NoError){qDebug() << "rootdoc is null";return false;}QJsonObject rootObj = rootDoc.object();// 删除数据rootObj.remove("name");// 删除数据对象中的数据QJsonValue scoreDataValue = rootObj.value("scoreData");QJsonObject scoreDataObj = scoreDataValue.toObject();scoreDataObj.remove("Chinese");rootObj["scoreData"] = scoreDataObj;// 删除数组中的数据QJsonValue techDataValue = rootObj.value("techData");QJsonArray techDataArray = techDataValue.toArray();for(int i = 0; i < techDataArray.size(); i++){if(techDataArray.at(i).toString().compare("PYTHON") == 0){techDataArray.removeAt(i);break;}}rootObj["techData"] = techDataArray;// 删除数组对象中的数据QJsonValue schoolDataValue = rootObj.value("schoolData");QJsonArray schoolDataArray = schoolDataValue.toArray();for(int i = 0; i < schoolDataArray.size(); i++){QJsonObject obj = schoolDataArray.at(i).toObject();if(obj.value("schoolName").toString().compare("xiaoxue") == 0){schoolDataArray.removeAt(i);break;}}rootObj["schoolData"] = schoolDataArray;QJsonDocument document;document.setObject(rootObj);QByteArray byJsonData = document.toJson(QJsonDocument::Compact);QString strJson(byJsonData);
-