json是一种编码来自 Javascript 的对象数据的格式,它在企业中广泛应用,不过在开发使用中,有新手不清楚qtjson数组文件怎么读写?接下来我们就来给大家讲解一下qtjson数组文件读写方法。
#头文件需要有
#include//文件 #include//格式头部 #include//元素 #include//文件流 #include #include #include #include #include #include #include
根据json内容在.h中定义class类,以下面的json数组为例
{ “ teamData”: [ { “ teamName”: “SVG”, “player1”: 5, “player2”: 5, “player3”: 5, “player4”: 5, “alivePlayer”: 0, “damage”: 0, “killNum”: 0 }, { “ teamName”: " Six9", “player1”: 5, “player2”: 5, “player3”: 5, “player4”: 5, “alivePlayer”: 0, “damage”: 0, “killNum”: 0 }, { “ teamName”: “Nova”, “player1”: 5, “player2”: 5, “player3”: 5, “player4”: 5, “alivePlayer”: 0, “damage”: 0, “killNum”: 0 } ] }
根据需求可以设定以下class:
class teamData { public: QString teamName; int player1; int player2; int player3; int player4; int alivePlayer; int damage; int killNum; };
其中可根据自己需求调整数量名称等;
定义函数: void AnalysisloadingData();
在函数中写入
void MainWindow::AnalysisNullTeamData() { QFile loadFile("C:/Users/Administrator/Desktop/teamData.json"); //解析文件地址名称 if (!loadFile.open(QIODevice::ReadOnly)) //文件是否可以打开 { qDebug() << "could't open projects json"; return; } QByteArray allData = loadFile.readAll(); loadFile.close(); //开始进行一系列JSON相关的处理 QJsonParseError json_error; QJsonDocument jsonDoc(QJsonDocument::fromJson(allData, & json_error)); if (json_error.error != QJsonParseError::NoError) //判断是否可以解析 { qDebug() << "json error!"; return; } QJsonObject rootObj = jsonDoc.object(); if (rootObj.contains("teamData")) { QJsonValue value = rootObj.value("teamData"); if (value.isArray()) { QJsonArray array = value.toArray(); TSize = array.size(); for (int i = 0; i < tsize; ++i) < p = "" > { teamData temp; temp.teamName = array.at(i) .toObject() .value("teamName") .toString(); temp.player1 = array.at(i) .toObject() .value("player1") .toInt(); temp.player2 = array.at(i) .toObject() .value("player2") .toInt(); temp.player3 = array.at(i) .toObject() .value("player3") .toInt(); temp.player4 = array.at(i) .toObject() .value("player4") .toInt(); temp.alivePlayer = array.at(i) .toObject() .value("alivePlayer") .toInt(); temp.killNum = array.at(i) .toObject() .value("killNum") .toInt(); temp.damage = array.at(i) .toObject() .value("damage") .toInt(); NowTeamData.append(temp); //设置list存放数组 } } } }
写数据也很简单
定义函数:void SaveTeamData()
void MainWindow::SaveTeamData() { QFile file("C:/Users/Administrator/Desktop/TeamData.json"); if (!file.open(QFile::WriteOnly | QFile::Truncate)) { qDebug() << "File open error"; } else { qDebug() << "File open!"; } file.resize(0); QJsonArray jsonArray; for (int i = 0; i < NowTeamData.length(); i++) { QJsonObject jsonObject; jsonObject.insert("teamName", NowTeamData.at(i) .teamName); jsonObject.insert("damage", NowTeamData.at(i) .damage); jsonObject.insert("killNum", NowTeamData.at(i) .killNum); jsonArray.append(jsonObject); } QJsonObject jsonObject; jsonObject.insert("teamData", jsonArray); jsonArray.append(jsonObject); QJsonDocument jsonDoc; jsonDoc.setObject(jsonObject); file.write(jsonDoc.toJson()); file.close(); } { “ teamData”: [ { “ damage”: 26930, “killNum”: 68, “teamName”: “SVG” }, { “ damage”: 476, “killNum”: 0, “teamName”: “Six9” }, { “ damage”: 768, “killNum”: 0, “teamName”: “Nova” } ] }
qt怎么解析json?
QT中使用json还是比较方便的,下面用例子直接说明:
QT使用json需要包含的头文件
#include < qjsondocument.h > #include #include #include
先看一段简单的生成QJSON数据的方法吧:
//简单的QTJson数据 QJsonObject simp_ayjson; simp_ayjson.insert("name", "LLH"); simp_ayjson.insert("age", 20); simp_ayjson.insert("myAccounts", QString::fromLocal8Bit("123你好")); QJsonDocument document; document.setObject(simp_ayjson); QByteArray simpbyte_array = document.toJson(QJsonDocument::Compact); QString simpjson_str(simpbyte_array); qDebug() << QString::fromLocal8Bit("简单的QTJson数据:") << simpjson_str;
输出结果:
"简单的QTJson数据:" "{\"age\":20,\"myAccounts\":\"123你好\",\"name\":\"LLH\"}"
解析方法是:
//简单的QT解析JSON QJsonParseError simp_json_error; QString name, myAccount; int age; //QTJSON所有的元素 QJsonDocument simp_parse_doucment = QJsonDocument::fromJson(simpjson_str.toUtf8(), & simp_json_error); //检查json是否有错误 if (simp_json_error.error == QJsonParseError::NoError) { if (simp_parse_doucment.isObject()) { //开始解析json对象 QJsonObject obj = simp_parse_doucment.object(); //如果包含name if (obj.contains("name")) { //的到name QJsonValue name_value = obj.take("name"); if (name_value.isString()) { //转换name name = name_value.toVariant() .toString(); } } if (obj.contains("myAccounts")) { QJsonValue myAccount_value = obj.take("myAccounts"); if (myAccount_value.isString()) { myAccount = myAccount_value.toString(); } } if (obj.contains("age")) { QJsonValue age_value = obj.take("age"); if (age_value.isDouble()) { age = age_value.toVariant() .toInt(); } } } } qDebug() << QString::fromLocal8Bit("简单的QT解析出来的数据:") << name << "," << age << "," << myAccount;
解析结果:
"简单的QT解析出来的数据:" "LLH" , 20 , "123你好"
其实这种json能满足一般的要求但是有些特殊数据要求json里面带有json数组就需要复杂一点的json了,来吧让我们继续。
复杂的json生成代码:
//复杂的QTJson数据 QJsonArray arrays; for (int i = 0; i < 5; i++) { arrays.insert(i, QString::fromLocal8Bit("你好:%1") .arg(i)); } QJsonObject complex_json; complex_json.insert("name", "LLHlllll"); complex_json.insert("age", 201); complex_json.insert("myAccounts", QString::fromLocal8Bit("123你好llll")); complex_json.insert("arrays", arrays); QJsonDocument complex_document; complex_document.setObject(complex_json); QByteArray complex_byte_array = complex_document.toJson(QJsonDocument::Compact); QString complex_json_str(complex_byte_array); qDebug() << "\n" << QString::fromLocal8Bit("复杂的QTJson数据:") << complex_json_str;
输出结果:
"复杂的QTJson数据:" "{\"age\":201,\"arrays\":[\"你好:0\",\"你好:1\",\"你好:2\",\"你好:3\",\"你好:4\"],\"myAccounts\":\"123你好llll\",\"name\":\"LLHlllll\"}"
那么让我们来看看复杂的json如何解析吧:
//复杂的QT数据解析 QJsonParseError complex_json_error; QJsonDocument complex_parse_doucment = QJsonDocument::fromJson(complex_json_str.toUtf8(), & complex_json_error); if (complex_json_error.error == QJsonParseError::NoError) { if (complex_parse_doucment.isObject()) { //开始解析json对象 QJsonObject jsonObject = complex_parse_doucment.object(); if (jsonObject.contains("name")) { QJsonValue groupName_value = jsonObject.take("name"); if (groupName_value.isString()) { name = groupName_value.toString(); } } if (jsonObject.contains("myAccounts")) { QJsonValue myAccount_value = jsonObject.take("myAccounts"); if (myAccount_value.isString()) { myAccount = myAccount_value.toVariant() .toString();; } } if (jsonObject.contains("age")) { QJsonValue groupIndex_value = jsonObject.take("age"); if (groupIndex_value.isDouble()) { age = groupIndex_value.toVariant() .toInt();; } } if (jsonObject.contains("arrays")) { QJsonValue arrays_value = jsonObject.take("arrays"); if (arrays_value.isArray()) //判断他是不是json数组 { QJsonArray heeloArray = arrays_value.toArray();; for (int i = 0; i < heeloArray.size(); i++) { QJsonValue helloArrayValue = heeloArray.at(i); if (helloArrayValue.isString()) { qDebug() << "\n" << QString::fromLocal8Bit("输出复杂的json:") << helloArrayValue.toString(); } } } } } }
可以看到复杂的json解析代码有点长,原因可能是QT喜欢w3c就是docment元素的解析风格,也就是docment树解析,把数据加载成一颗树,然后在进行解析,好处是速度快,缺点是需要大量内存,代码虽然长点但是好理解,因为每一步都他的解析方式。
解析结果:
"输出复杂的json:" "你好:0" "输出复杂的json:" "你好:1" "输出复杂的json:" "你好:2" "输出复杂的json:" "你好:3" "输出复杂的json:" "你好:4"
这样我们就完成了qtjson的解析,json解析是开发人员必备的基础技能,如果我们不会json解析,很多事都无法完成,因此掌握json解析很重要!最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。
推荐阅读: