• 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"

     

  • 相关阅读:
    springboot热部署
    maven换仓库地址
    floyd求最小环+例题(hdu1599)
    矩阵乘法+folyd(hdu2807)
    TSP问题+例题
    迪杰斯特拉模板题(迪杰斯特拉模板)
    小w的糖果
    DongDong坐飞机
    DongDong跳一跳
    主席树入门
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/15791470.html
Copyright © 2020-2023  润新知