Qt 使用QJson生成解析json数据的方法


 QT中使用json还是比较方便的,下面用例子直接说明

之后根据这个格式进行json数据解析。

QT使用json需要包含的头文件

1 #include<qjsondocument.h>
2 #include<qjsonarray.h>
3 #include<qjsonobject.h>
4 #include<qjsonvalue.h>

先看一段简单的生成QJSON数据的方法吧:

 1     //简单的QTJson数据
 2  QJsonObject simp_ayjson;  3     simp_ayjson.insert("name", "LLH");  4     simp_ayjson.insert("age", 20);  5     simp_ayjson.insert("myAccounts", QString::fromLocal8Bit("123你好"));  6  QJsonDocument document;  7  document.setObject(simp_ayjson);  8     QByteArray simpbyte_array = document.toJson(QJsonDocument::Compact);  9  QString simpjson_str(simpbyte_array); 10     qDebug() << QString::fromLocal8Bit("简单的QTJson数据:") << simpjson_str;

输出结果:

"简单的QTJson数据:" "{\"age\":20,\"myAccounts\":\"123你好\",\"name\":\"LLH\"}"

解析方法是:

 1     //简单的QT解析JSON
 2  QJsonParseError simp_json_error;  3  QString name, myAccount;  4     int age;  5     //QTJSON所有的元素
 6     QJsonDocument simp_parse_doucment = QJsonDocument::fromJson(simpjson_str.toUtf8(), &simp_json_error);  7     //检查json是否有错误
 8     if (simp_json_error.error == QJsonParseError::NoError)  9  { 10         if (simp_parse_doucment.isObject()) 11  { 12             //开始解析json对象
13             QJsonObject obj = simp_parse_doucment.object(); 14             //如果包含name
15             if (obj.contains("name")) 16  { 17                 //的到name
18                 QJsonValue name_value = obj.take("name"); 19                 if (name_value.isString()) 20  { 21                     //转换name
22                     name = name_value.toVariant().toString(); 23  } 24  } 25             if (obj.contains("myAccounts")) 26  { 27                 QJsonValue myAccount_value = obj.take("myAccounts"); 28                 if (myAccount_value.isString()) 29  { 30                         myAccount = myAccount_value.toString(); 31  } 32  } 33             if (obj.contains("age")) 34  { 35                 QJsonValue age_value = obj.take("age"); 36                 if (age_value.isDouble()) 37  { 38                     age = age_value.toVariant().toInt(); 39  } 40  } 41  } 42  } 43     qDebug() << QString::fromLocal8Bit("简单的QT解析出来的数据:") << name << "," << age << "," << myAccount;

解析结果:

"简单的QT解析出来的数据:" "LLH" , 20 , "123你好"

其实这种json能满足一般的要求但是有些特殊数据要求json里面带有json数组就需要复杂一点的json了,来吧让我们继续。

复杂的json生成代码:

 1     //复杂的QTJson数据 
 2  QJsonArray arrays;  3     for (int i = 0; i < 5;i++)  4  {  5         arrays.insert(i, QString::fromLocal8Bit("你好:%1").arg(i));  6  }  7  QJsonObject complex_json;  8     complex_json.insert("name", "LLHlllll");  9     complex_json.insert("age", 201); 10     complex_json.insert("myAccounts", QString::fromLocal8Bit("123你好llll")); 11     complex_json.insert("arrays", arrays); 12  QJsonDocument complex_document; 13  complex_document.setObject(complex_json); 14     QByteArray complex_byte_array = complex_document.toJson(QJsonDocument::Compact); 15  QString complex_json_str(complex_byte_array); 16     qDebug() <<"\n"<< QString::fromLocal8Bit("复杂的QTJson数据:") << complex_json_str;

输出结果:

"复杂的QTJson数据:" "{\"age\":201,\"arrays\":[\"你好:0\",\"你好:1\",\"你好:2\",\"你好:3\",\"你好:4\"],\"myAccounts\":\"123你好llll\",\"name\":\"LLHlllll\"}"

那么让我们来看看复杂的json如何解析吧:

 1 //复杂的QT数据解析
 2  QJsonParseError complex_json_error;  3     QJsonDocument complex_parse_doucment = QJsonDocument::fromJson(complex_json_str.toUtf8(), &complex_json_error);  4     if (complex_json_error.error == QJsonParseError::NoError)  5  {  6         if (complex_parse_doucment.isObject())  7  {  8             //开始解析json对象
 9             QJsonObject jsonObject = complex_parse_doucment.object(); 10             if (jsonObject.contains("name")) 11  { 12                 QJsonValue groupName_value = jsonObject.take("name"); 13                 if (groupName_value.isString()) 14  { 15                     name = groupName_value.toString(); 16  } 17  } 18             if (jsonObject.contains("myAccounts")) 19  { 20                 QJsonValue myAccount_value = jsonObject.take("myAccounts"); 21                 if (myAccount_value.isString()) 22  { 23                     myAccount = myAccount_value.toVariant().toString();; 24  } 25  } 26             if (jsonObject.contains("age")) 27  { 28                 QJsonValue groupIndex_value = jsonObject.take("age"); 29                 if (groupIndex_value.isDouble()) 30  { 31                     age = groupIndex_value.toVariant().toInt();; 32  } 33  } 34             if (jsonObject.contains("arrays")) 35  { 36                 QJsonValue arrays_value = jsonObject.take("arrays"); 37                 if (arrays_value.isArray())//判断他是不是json数组
38  { 39                    QJsonArray heeloArray = arrays_value.toArray();; 40                    for (int i = 0; i < heeloArray.size(); i++){ 41                     QJsonValue helloArrayValue = heeloArray.at(i); 42                        if (helloArrayValue.isString()) 43  { 44                            qDebug() <<"\n"<< QString::fromLocal8Bit("输出复杂的json:") << helloArrayValue.toString(); 45  } 46  } 47  } 48  } 49  } 50     }

可以看到复杂的json解析代码有点长,原因可能是QT喜欢w3c就是docment元素的解析风格,也就是docment树解析,把数据加载成一颗树,然后在进行解析,好处是速度快,缺点是需要大量内存,代码虽然长点但是好理解,因为每一步都他的解析方式。

解析结果:

1  "输出复杂的json:" "你好:0"
2 
3  "输出复杂的json:" "你好:1"
4 
5  "输出复杂的json:" "你好:2"
6 
7  "输出复杂的json:" "你好:3"
8 
9  "输出复杂的json:" "你好:4"

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM