一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

 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"
复制代码

 

posted on   一杯清酒邀明月  阅读(1602)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2021-01-12 Qt 渐变 QLinearGradient、 QConicalGradient、QRadialGradient
2021-01-12 Qt 加载HeightMap(高度图)构造3D地形图
2021-01-12 VisionPro内嵌脚本编译时显示:未定义类型“CogFindCircleTool”。未定义类型“CogToolResultConstants”
2021-01-12 VisionPro CogPMAlignTool
2021-01-12 VisionPro 卡尺原理
2021-01-12 VisionPro 卡尺测量长度的例子
2021-01-12 VisionPro 自学帮助
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示