Qt解析Json字符串基本操作
第一次写博客,记录下工作中遇到的问题—
对于一个Json字符串如下:
[{
“测试项”: {
“TestName”: “手工”,
“IsPowerOn”: true,
“TestTool”: “J-link”,
“TestType”: “1”
},
“测试项1”: {
“TestName”: “自动”,
“IsPowerOn”: true,
“TestTool”: “J-link”,
“TestType”: “2”
},
“测试项2”: {
“TestName”: “停止”,
“IsPowerOn”: true,
“TestTool”: “J-link”,
“TestType”: “3”
},
“测试点集”: [{
“TestPointName”: “近点”,
“x”: “345”,
“y”: “221”,
“TestResult”: “通过”
}, {
“TestPointName”: “远点”,
“x”: “145”,
“y”: “211”,
“TestResult”: “通过”
}, {
“TestPointName”: “中点”,
“x”: “545”,
“y”: “921”,
“TestResult”: “通过”
}]
}, {
“测试项”: {
“TestName”: “无测试”,
“IsPowerOn”: true,
“TestTool”: “Multimeter”,
“TestType”: “4”
}
}]
1.需要包含的Qt库
2.具体操作
操作函数如下:
传递参数为const char *是为了后续工作兼容其他开发环境(例如c#),传递string类型等会失败
int json(const char *c_json)
这里传入参数,将const char*转换为QByteArray
/*将const char * 转化为string*/
QString c_json_str = QString::fromStdString(string(c_json));
QByteArray c_doc = QByteArray::fromStdString(c_json_str.toStdString());
下面调用QJsonDocument::fromJson函数解析Json字符串是否合法
/*解析json字符串**/
QJsonParseError err_rpt;
QJsonDocument root_Doc = QJsonDocument::fromJson(c_doc,&err_rpt);
if(err_rpt.error!=QJsonParseError::NoError){
/*失败*/
printf("json read fault\r\n");
return -1;
}else{
/*成功*/
printf("json read success\r\n");
}
转化为数组形式(根据实际传入的Json字符串具体分析)
/*
* 如果字符串外层为{},那么将QJsonArray替换为QJsonObject
*/
QJsonArray json_array = root_Doc.array();
根据上面的Json字符串进行遍历,主要用到的类有QJsonObject,OJsonArray,对于非数组形式的字符串需要用到迭代器QJsonObject::iterator进行操作
/*遍历json字符串*/
for(int i = 0;i<json_array.size();i++){
QJsonObject json_child_obj = json_array[i].toObject();
QJsonObject::iterator iter;
for(iter = json_child_obj.begin();iter != json_child_obj.end();iter++){
QString str = iter.key();
if(!!str.compare("测试点集")){
QJsonObject s_obj = iter.value().toObject();
qDebug() << str << ":" <<s_obj["TestName"].toString()
<< s_obj["IsPowerOn"].toBool()
<< s_obj["TestTool"].toString()
<< s_obj["TestType"].toString();
}else{
QJsonArray json_child_array = iter.value().toArray();
for(int k = 0;k<json_child_array.size();k++){
QJsonObject a_obj = json_child_array[k].toObject();
qDebug() << iter.key() << ":"
<< "pointname" << a_obj["TestPointName"].toString()
<< "x:" << a_obj["x"].toString()
<< "y:" << a_obj["y"].toString()
<< "TestResult" << a_obj["TestResult"].toString();
}
}
}
}
如此即完成了对Json字符串的遍历
现附上完整代码如下:
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QFile>
#include <QDebug>
#include <qtextcodec.h>
#include <iostream>
#include <string.h>
#include <string>
int json(const char *c_json);
int main(int argc,char **argv)
{
QFile file("C:/Users/Administrator/Desktop/json9.txt");
file.open(QIODevice::ReadOnly | QIODevice::Text);
QByteArray value = file.readAll();
file.close();
string s = value.toStdString();
const char *test_str = s.c_str();
json(test_str);
return 0;
}
int json(const char *c_json)
{
/*将const char * 转化为string*/
QString c_json_str = QString::fromStdString(string(c_json));
QByteArray c_doc = QByteArray::fromStdString(c_json_str.toStdString());
/*解析json字符串**/
QJsonParseError err_rpt;
QJsonDocument root_Doc = QJsonDocument::fromJson(c_doc,&err_rpt);
if(err_rpt.error!=QJsonParseError::NoError){
/*失败*/
printf("json read fault\r\n");
return -1;
}else{
/*成功*/
printf("json read success\r\n");
}
/*
* 如果字符串外层为{},那么将QJsonArray替换为QJsonObject
*/
QJsonArray json_array = root_Doc.array();
/*遍历json字符串*/
for(int i = 0;i<json_array.size();i++){
QJsonObject json_child_obj = json_array[i].toObject();
QJsonObject::iterator iter;
for(iter = json_child_obj.begin();iter != json_child_obj.end();iter++){
QString str = iter.key();
if(!!str.compare("测试点集")){
QJsonObject s_obj = iter.value().toObject();
qDebug() << str << ":" <<s_obj["TestName"].toString()
<< s_obj["IsPowerOn"].toBool()
<< s_obj["TestTool"].toString()
<< s_obj["TestType"].toString();
}else{
QJsonArray json_child_array = iter.value().toArray();
for(int k = 0;k<json_child_array.size();k++){
QJsonObject a_obj = json_child_array[k].toObject();
qDebug() << iter.key() << ":"
<< "pointname" << a_obj["TestPointName"].toString()
<< "x:" << a_obj["x"].toString()
<< "y:" << a_obj["y"].toString()
<< "TestResult" << a_obj["TestResult"].toString();
}
}
}
}
return 0;
}
测试结果如下:
感谢每一位大佬的付出!