当前位置:   article > 正文

C/C++ Qt JSON解析库解析篇_qjsonobject

qjsonobject

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,通常用于在不同系统之间传递数据。它是一种文本格式,易于阅读和编写,同时也易于解析和生成。JSON 数据格式采用键值对的方式组织数据,支持嵌套结构,包括对象(Object)和数组(Array)。

Qt库为JSON的相关操作提供了完整的类支持,读者可以使用 QJsonDocument 类和相关的类(例如 QJsonObject、QJsonArray、QJsonValue)来解析和生成 JSON 数据。在使用JSON解析文件之前需要先通过TextStream流将文件读入到字符串变量内,然后再通过QJsonDocument等库对该JSON格式进行解析,以提取出我们所需字段。

首先创建一个解析文件,命名为config.json我们将通过代码依次解析这个JSON文件中的每一个参数,具体解析代码如下:

  1. {
  2.     "blog""https://xxx/",
  3.     "enable"true,
  4.     "status"1024,
  5.     
  6.     "GetDict": {"address":"192.168.1.1","username":"root","password":"123456","update":"2020-09-26"},
  7.     "GetList": [1,2,3,4,5,6,7,8,9,0],
  8.     
  9.     "ObjectInArrayJson":
  10.     {
  11.         "One": ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
  12.         "Two": ["Sunday","Monday","Tuesday"]
  13.     },
  14.     
  15.     "ArrayJson": [
  16.         ["192.168.1.1","root","22"],
  17.         ["192.168.1.2","root","23"],
  18.         ["192.168.1.3","root","24"],
  19.         ["192.168.1.4","root","25"],
  20.         ["192.168.1.5","root","26"]
  21.     ],
  22.     
  23.     "ObjectJson": [
  24.         {"address":"192.168.1.1","username":"admin"},
  25.         {"address":"192.168.1.2","username":"root"},
  26.         {"address":"192.168.1.3","username":"lyshark"}
  27.     ],
  28.     
  29.     "ObjectArrayJson": [
  30.         {"uname":"root","ulist":[1,2,3,4,5]},
  31.         {"uname":"lyshark","ulist":[11,22,33,44,55,66,77,88,99]}
  32.     ],
  33.     
  34.     "NestingObjectJson": [
  35.         {
  36.             "uuid""1001",
  37.             "basic": {
  38.                 "lat""12.657"
  39.                 "lon""55.789"
  40.             }
  41.         },
  42.         {
  43.             "uuid""1002",
  44.             "basic": {
  45.                 "lat""31.24"
  46.                 "lon""25.55"
  47.             }
  48.         }
  49.     ],
  50.     
  51.     "ArrayNestingArrayJson":
  52.     [
  53.         {
  54.             "telephone""1323344521",
  55.             "path": [
  56.                 [
  57.                     11.5,22.4,56.9
  58.                 ],
  59.                 [
  60.                     19.4,34.6,44.7
  61.                 ]
  62.             ]
  63.         }
  64.     ]
  65. }

首先实现读写文本文件,通过QT中封装的<QFile>库可实现对文本文件的读取操作,读取JSON文件可使用该方式.

  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QString>
  4. #include <QTextStream>
  5. #include <QFile>
  6. #include <QDir>
  7. #include <QFileInfo>
  8. #include <QJsonDocument>
  9. #include <QJsonParseError>
  10. #include <QJsonObject>
  11. #include <QJsonArray>
  12. #include <QJsonValue>
  13. #include <QJsonValueRef>
  14. // 传入文本路径,读取并输出
  15. int readonly_string_file(QString file_path)
  16. {
  17.     QFile this_file_ptr(file_path);
  18.     // 判断文件是否存在
  19.     if(false == this_file_ptr.exists())
  20.     {
  21.         std::cout << "文件不存在" << std::endl;
  22.         return 0;
  23.     }
  24.     /*
  25.      * 文件打开属性包括如下
  26.      * QIODevice::ReadOnly  只读方式打开
  27.      * QIODevice::WriteOnly 写入方式打开
  28.      * QIODevice::ReadWrite 读写方式打开
  29.      * QIODevice::Append    追加方式打开
  30.      * QIODevice::Truncate  截取方式打开
  31.      * QIODevice::Text      文本方式打开
  32.      */
  33.     if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
  34.     {
  35.         std::cout << "打开失败" << std::endl;
  36.         return 0;
  37.     }
  38.     // 读取到文本中的字符串
  39.     QString string_value = this_file_ptr.readAll();
  40.     std::cout << "读入长度: " << this_file_ptr.size() << std::endl;
  41.     std::cout << "字符串: " << string_value.toStdString() << std::endl;
  42.     this_file_ptr.close();
  43. }
  44. // 逐行读取文本文件
  45. void read_line_file()
  46. {
  47.     QFile this_file_ptr("d:/config.json");
  48.     if(this_file_ptr.open((QIODevice::ReadOnly | QIODevice::Text)))
  49.     {
  50.         QByteArray byte_array;
  51.         while(false == this_file_ptr.atEnd())
  52.         {
  53.             byte_array += this_file_ptr.readLine();
  54.         }
  55.         std::cout << "完整文本: " << QString(byte_array).toStdString() << std::endl;
  56.         this_file_ptr.close();
  57.     }
  58. }
  59. // 传入文本路径与写入内容,写入到文件
  60. void write_string_file(QString file_path, QString string_value)
  61. {
  62.     QFile this_file_ptr(file_path);
  63.     // 判断文件是否存在
  64.     if(false == this_file_ptr.exists())
  65.     {
  66.         return;
  67.     }
  68.     // 打开失败
  69.     if(false == this_file_ptr.open(QIODevice::ReadWrite | QIODevice::Text))
  70.     {
  71.         return;
  72.     }
  73.     //写入内容,注意需要转码,否则会报错
  74.     QByteArray write_string = string_value.toUtf8();
  75.     //写入QByteArray格式字符串
  76.     this_file_ptr.write(write_string);
  77.     this_file_ptr.close();
  78. }
  79. // 计算文件或目录大小
  80. unsigned int GetFileSize(QString path)
  81. {
  82.     QFileInfo info(path);
  83.     unsigned int ret = 0;
  84.     if(info.isFile())
  85.     {
  86.         ret = info.size();
  87.     }
  88.     else if(info.isDir())
  89.     {
  90.         QDir dir(path);
  91.         QFileInfoList list = dir.entryInfoList();
  92.         for(int i = 0; i < list.count(); i++)
  93.         {
  94.             if((list[i].fileName() != ".") && (list[i].fileName() != ".."))
  95.             {
  96.                 ret += GetFileSize(list[i].absoluteFilePath());
  97.             }
  98.         }
  99.     }
  100.     return ret;
  101. }
  102. int main(int argc, char *argv[])
  103. {
  104.     QCoreApplication a(argc, argv);
  105.     // 读取文件
  106.     readonly_string_file("d:/config.json");
  107.     // 计算文件或目录大小
  108.     unsigned int file_size = GetFileSize("d:/xunjian");
  109.     std::cout << "获取文件或目录大小: " << file_size << std::endl;
  110.     // 覆盖写入文件
  111.     QString write_file_path = "d:/test.json";
  112.     QString write_string = "hello lyshark";
  113.     write_string_file(write_file_path,write_string);
  114.     return a.exec();
  115. }

实现解析根对象中的单一键值对,例如解析配置文件中的blog,enable,status等这些独立的字段值.

  1. // 读取JSON文本
  2. QString readonly_string(QString file_path)
  3. {
  4.     QFile this_file_ptr(file_path);
  5.     if(false == this_file_ptr.exists())
  6.     {
  7.         return "None";
  8.     }
  9.     if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
  10.     {
  11.         return "None";
  12.     }
  13.     QString string_value = this_file_ptr.readAll();
  14.     this_file_ptr.close();
  15.     return string_value;
  16. }
  17. int main(int argc, char *argv[])
  18. {
  19.     QCoreApplication a(argc, argv);
  20.     // 读取文件
  21.     QString config = readonly_string("d:/config.json");
  22.     if(config == "None")
  23.     {
  24.         return 0;
  25.     }
  26.     // 字符串格式化为JSON
  27.     QJsonParseError err_rpt;
  28.     QJsonDocument  root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
  29.     if(err_rpt.error != QJsonParseError::NoError)
  30.     {
  31.         std::cout << "JSON格式错误" << std::endl;
  32.         return 0;
  33.     }
  34.     // 获取到Json字符串的根节点
  35.     QJsonObject root_object = root_document.object();
  36.     // 解析blog字段
  37.     QString blog = root_object.find("blog").value().toString();
  38.     std::cout << "字段对应的值 = > "<< blog.toStdString() << std::endl;
  39.     // 解析enable字段
  40.     bool enable = root_object.find("enable").value().toBool();
  41.     std::cout << "是否开启状态: " << enable << std::endl;
  42.     // 解析status字段
  43.     int status = root_object.find("status").value().toInt();
  44.     std::cout << "状态数值: " << status << std::endl;
  45.     return a.exec();
  46. }

实现解析简单的单对象单数组结构,如上配置文件中的GetDictGetList既是我们需要解析的内容.

  1. // 读取JSON文本
  2. QString readonly_string(QString file_path)
  3. {
  4.     QFile this_file_ptr(file_path);
  5.     if(false == this_file_ptr.exists())
  6.     {
  7.         return "None";
  8.     }
  9.     if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
  10.     {
  11.         return "None";
  12.     }
  13.     QString string_value = this_file_ptr.readAll();
  14.     this_file_ptr.close();
  15.     return string_value;
  16. }
  17. int main(int argc, char *argv[])
  18. {
  19.     QCoreApplication a(argc, argv);
  20.     // 读取文件
  21.     QString config = readonly_string("d:/config.json");
  22.     if(config == "None")
  23.     {
  24.         return 0;
  25.     }
  26.     // 字符串格式化为JSON
  27.     QJsonParseError err_rpt;
  28.     QJsonDocument  root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
  29.     if(err_rpt.error != QJsonParseError::NoError)
  30.     {
  31.         std::cout << "JSON格式错误" << std::endl;
  32.         return 0;
  33.     }
  34.     // 获取到Json字符串的根节点
  35.     QJsonObject root_object = root_document.object();
  36.     // 解析单一对象
  37.     QJsonObject get_dict_ptr = root_object.find("GetDict").value().toObject();
  38.     QVariantMap map = get_dict_ptr.toVariantMap();
  39.     if(map.contains("address") && map.contains("username") && map.contains("password") && map.contains("update"))
  40.     {
  41.         QString address = map["address"].toString();
  42.         QString username = map["username"].toString();
  43.         QString password = map["password"].toString();
  44.         QString update = map["update"].toString();
  45.         std::cout
  46.                   << " 地址: " << address.toStdString()
  47.                   << " 用户名: " << username.toStdString()
  48.                   << " 密码: " << password.toStdString()
  49.                   << " 更新日期: " << update.toStdString()
  50.                   << std::endl;
  51.     }
  52.     // 解析单一数组
  53.     QJsonArray get_list_ptr = root_object.find("GetList").value().toArray();
  54.     for(int index=0; index < get_list_ptr.count(); index++)
  55.     {
  56.         int ref_value = get_list_ptr.at(index).toInt();
  57.         std::cout << "输出数组元素: " << ref_value << std::endl;
  58.     }
  59.     return a.exec();
  60. }

实现解析对象嵌套对象对象中嵌套数组结构,如上配置文件中的ObjectInArrayJson既是我们需要解析的内容.

  1. // 读取JSON文本
  2. QString readonly_string(QString file_path)
  3. {
  4.     QFile this_file_ptr(file_path);
  5.     if(false == this_file_ptr.exists())
  6.     {
  7.         return "None";
  8.     }
  9.     if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
  10.     {
  11.         return "None";
  12.     }
  13.     QString string_value = this_file_ptr.readAll();
  14.     this_file_ptr.close();
  15.     return string_value;
  16. }
  17. int main(int argc, char *argv[])
  18. {
  19.     QCoreApplication a(argc, argv);
  20.     // 读取文件
  21.     QString config = readonly_string("d:/config.json");
  22.     if(config == "None")
  23.     {
  24.         return 0;
  25.     }
  26.     // 字符串格式化为JSON
  27.     QJsonParseError err_rpt;
  28.     QJsonDocument  root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
  29.     if(err_rpt.error != QJsonParseError::NoError)
  30.     {
  31.         std::cout << "JSON格式错误" << std::endl;
  32.         return 0;
  33.     }
  34.     // 获取到Json字符串的根节点
  35.     QJsonObject root_object = root_document.object();
  36.     // 找到Object对象
  37.     QJsonObject one_object_json = root_object.find("ObjectInArrayJson").value().toObject();
  38.     // 转为MAP映射
  39.     QVariantMap map = one_object_json.toVariantMap();
  40.     // 寻找One键
  41.     QJsonArray array_one = map["One"].toJsonArray();
  42.     for(int index=0; index < array_one.count(); index++)
  43.     {
  44.         QString value = array_one.at(index).toString();
  45.         std::cout << "One => "<< value.toStdString() << std::endl;
  46.     }
  47.     // 寻找Two键
  48.     QJsonArray array_two = map["Two"].toJsonArray();
  49.     for(int index=0; index < array_two.count(); index++)
  50.     {
  51.         QString value = array_two.at(index).toString();
  52.         std::cout << "Two => "<< value.toStdString() << std::endl;
  53.     }
  54.     return a.exec();
  55. }

实现解析数组中的数组结构,如上配置文件中的ArrayJson既是我们需要解析的内容.

  1. // 读取JSON文本
  2. QString readonly_string(QString file_path)
  3. {
  4.     QFile this_file_ptr(file_path);
  5.     if(false == this_file_ptr.exists())
  6.     {
  7.         return "None";
  8.     }
  9.     if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
  10.     {
  11.         return "None";
  12.     }
  13.     QString string_value = this_file_ptr.readAll();
  14.     this_file_ptr.close();
  15.     return string_value;
  16. }
  17. int main(int argc, char *argv[])
  18. {
  19.     QCoreApplication a(argc, argv);
  20.     // 读取文件
  21.     QString config = readonly_string("d:/config.json");
  22.     if(config == "None")
  23.     {
  24.         return 0;
  25.     }
  26.     // 字符串格式化为JSON
  27.     QJsonParseError err_rpt;
  28.     QJsonDocument  root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
  29.     if(err_rpt.error != QJsonParseError::NoError)
  30.     {
  31.         std::cout << "json 格式错误" << std::endl;
  32.         return 0;
  33.     }
  34.     // 获取到Json字符串的根节点
  35.     QJsonObject root_object = root_document.object();
  36.     // 获取MyJson数组
  37.     QJsonValue array_value = root_object.value("ArrayJson");
  38.     // 验证节点是否为数组
  39.     if(array_value.isArray())
  40.     {
  41.         // 得到数组个数
  42.         int array_count = array_value.toArray().count();
  43.         // 循环数组个数
  44.         for(int index=0;index <= array_count;index++)
  45.         {
  46.             QJsonValue parset = array_value.toArray().at((index));
  47.             if(parset.isArray())
  48.             {
  49.                 QString address = parset.toArray().at(0).toString();
  50.                 QString username = parset.toArray().at(1).toString();
  51.                 QString userport = parset.toArray().at(2).toString();
  52.                 std::cout
  53.                         << "地址: " << address.toStdString()
  54.                         << " 用户名: " << username.toStdString()
  55.                         << " 端口号: " << userport.toStdString()
  56.                 << std::endl;
  57.             }
  58.         }
  59.     }
  60.     return a.exec();
  61. }

实现解析数组中的多对象结构,如上配置文件中的ObjectJson既是我们需要解析的内容.

  1. // 读取JSON文本
  2. QString readonly_string(QString file_path)
  3. {
  4.     QFile this_file_ptr(file_path);
  5.     if(false == this_file_ptr.exists())
  6.     {
  7.         return "None";
  8.     }
  9.     if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
  10.     {
  11.         return "None";
  12.     }
  13.     QString string_value = this_file_ptr.readAll();
  14.     this_file_ptr.close();
  15.     return string_value;
  16. }
  17. int main(int argc, char *argv[])
  18. {
  19.     QCoreApplication a(argc, argv);
  20.     // 读取文件
  21.     QString config = readonly_string("d:/config.json");
  22.     if(config == "None")
  23.     {
  24.         return 0;
  25.     }
  26.     // 字符串格式化为JSON
  27.     QJsonParseError err_rpt;
  28.     QJsonDocument  root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
  29.     if(err_rpt.error != QJsonParseError::NoError)
  30.     {
  31.         std::cout << "json 格式错误" << std::endl;
  32.         return 0;
  33.     }
  34.     // 获取到Json字符串的根节点
  35.     QJsonObject root_object = root_document.object();
  36.     // 获取MyJson数组
  37.     QJsonValue object_value = root_object.value("ObjectJson");
  38.     // 验证是否为数组
  39.     if(object_value.isArray())
  40.     {
  41.         // 获取对象个数
  42.         int object_count = object_value.toArray().count();
  43.         // 循环个数
  44.         for(int index=0;index <= object_count;index++)
  45.         {
  46.             QJsonObject obj = object_value.toArray().at(index).toObject();
  47.             // 验证数组不为空
  48.             if(!obj.isEmpty())
  49.             {
  50.                 QString address = obj.value("address").toString();
  51.                 QString username = obj.value("username").toString();
  52.                 std::cout << "地址: " << address.toStdString() << " 用户: " << username.toStdString() << std::endl;
  53.             }
  54.         }
  55.     }
  56.     return a.exec();
  57. }

实现解析数组中对象中的嵌套数组结构,如上配置文件中的ObjectArrayJson既是我们需要解析的内容.

  1. // 读取JSON文本
  2. QString readonly_string(QString file_path)
  3. {
  4.     QFile this_file_ptr(file_path);
  5.     if(false == this_file_ptr.exists())
  6.     {
  7.         return "None";
  8.     }
  9.     if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
  10.     {
  11.         return "None";
  12.     }
  13.     QString string_value = this_file_ptr.readAll();
  14.     this_file_ptr.close();
  15.     return string_value;
  16. }
  17. int main(int argc, char *argv[])
  18. {
  19.     QCoreApplication a(argc, argv);
  20.     // 读取文件
  21.     QString config = readonly_string("d:/config.json");
  22.     if(config == "None")
  23.     {
  24.         return 0;
  25.     }
  26.     // 字符串格式化为JSON
  27.     QJsonParseError err_rpt;
  28.     QJsonDocument  root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
  29.     if(err_rpt.error != QJsonParseError::NoError)
  30.     {
  31.         std::cout << "json 格式错误" << std::endl;
  32.         return 0;
  33.     }
  34.     // 获取到Json字符串的根节点
  35.     QJsonObject root_object = root_document.object();
  36.     // 获取MyJson数组
  37.     QJsonValue object_value = root_object.value("ObjectArrayJson");
  38.     // 验证是否为数组
  39.     if(object_value.isArray())
  40.     {
  41.         // 获取对象个数
  42.         int object_count = object_value.toArray().count();
  43.         // 循环个数
  44.         for(int index=0;index <= object_count;index++)
  45.         {
  46.             QJsonObject obj = object_value.toArray().at(index).toObject();
  47.             // 验证数组不为空
  48.             if(!obj.isEmpty())
  49.             {
  50.                 QString uname = obj.value("uname").toString();
  51.                 std::cout << "用户名: " << uname.toStdString() <<  std::endl;
  52.                 // 解析该用户的数组
  53.                 int array_count = obj.value("ulist").toArray().count();
  54.                 std::cout << "数组个数: "<< array_count << std::endl;
  55.                 for(int index=0;index < array_count;index++)
  56.                 {
  57.                     QJsonValue parset = obj.value("ulist").toArray().at(index);
  58.                     int val = parset.toInt();
  59.                     std::cout << "Value = > "<< val << std::endl;
  60.                 }
  61.             }
  62.         }
  63.     }
  64.     return a.exec();
  65. }

实现解析数组嵌套匿名对象嵌套对象结构,如上配置文件中的NestingObjectJson既是我们需要解析的内容.

  1. // 读取JSON文本
  2. QString readonly_string(QString file_path)
  3. {
  4.     QFile this_file_ptr(file_path);
  5.     if(false == this_file_ptr.exists())
  6.     {
  7.         return "None";
  8.     }
  9.     if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
  10.     {
  11.         return "None";
  12.     }
  13.     QString string_value = this_file_ptr.readAll();
  14.     this_file_ptr.close();
  15.     return string_value;
  16. }
  17. int main(int argc, char *argv[])
  18. {
  19.     QCoreApplication a(argc, argv);
  20.     // 读取文件
  21.     QString config = readonly_string("d:/config.json");
  22.     if(config == "None")
  23.     {
  24.         return 0;
  25.     }
  26.     // 字符串格式化为JSON
  27.     QJsonParseError err_rpt;
  28.     QJsonDocument  root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
  29.     if(err_rpt.error != QJsonParseError::NoError)
  30.     {
  31.         std::cout << "json 格式错误" << std::endl;
  32.         return 0;
  33.     }
  34.     // 获取到Json字符串的根节点
  35.     QJsonObject root_object = root_document.object();
  36.     // 获取NestingObjectJson数组
  37.     QJsonValue array_value = root_object.value("NestingObjectJson");
  38.     // 验证节点是否为数组
  39.     if(array_value.isArray())
  40.     {
  41.         // 得到内部对象个数
  42.         int count = array_value.toArray().count();
  43.         std::cout << "对象个数: " << count << std::endl;
  44.         for(int index=0; index < count; index++)
  45.         {
  46.             // 得到数组中的index下标中的对象
  47.             QJsonObject array_object = array_value.toArray().at(index).toObject();
  48.             // 开始解析basic中的数据
  49.             QJsonObject basic = array_object.value("basic").toObject();
  50.             QString lat = basic.value("lat").toString();
  51.             QString lon = basic.value("lon").toString();
  52.             std::cout << "解析basic中的lat字段: " << lat.toStdString() << std::endl;
  53.             std::cout << "解析basic中的lon字段: " << lon.toStdString()<< std::endl;
  54.             // 解析单独字段
  55.             QString status = array_object.value("status").toString();
  56.             std::cout << "解析字段状态: " << status.toStdString() << std::endl;
  57.         }
  58.     }
  59.     return a.exec();
  60. }

实现解析数组嵌套对象对象内嵌套双层数组结构,如上配置文件中的ArrayNestingArrayJson既我们需要解析的内容.

  1. // 读取JSON文本
  2. QString readonly_string(QString file_path)
  3. {
  4.     QFile this_file_ptr(file_path);
  5.     if(false == this_file_ptr.exists())
  6.     {
  7.         return "None";
  8.     }
  9.     if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
  10.     {
  11.         return "None";
  12.     }
  13.     QString string_value = this_file_ptr.readAll();
  14.     this_file_ptr.close();
  15.     return string_value;
  16. }
  17. int main(int argc, char *argv[])
  18. {
  19.     QCoreApplication a(argc, argv);
  20.     // 读取文件
  21.     QString config = readonly_string("d:/config.json");
  22.     if(config == "None")
  23.     {
  24.         return 0;
  25.     }
  26.     // 字符串格式化为JSON
  27.     QJsonParseError err_rpt;
  28.     QJsonDocument  root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
  29.     if(err_rpt.error != QJsonParseError::NoError)
  30.     {
  31.         std::cout << "json 格式错误" << std::endl;
  32.         return 0;
  33.     }
  34.     // 获取到Json字符串的根节点
  35.     QJsonObject root_object = root_document.object();
  36.     // 获取NestingObjectJson数组
  37.     QJsonValue array_value = root_object.value("ArrayNestingArrayJson");
  38.     // 验证节点是否为数组
  39.     if(array_value.isArray())
  40.     {
  41.         // 得到数组中的0号下标中的对象
  42.         QJsonObject array_object = array_value.toArray().at(0).toObject();
  43.         // 解析手机号字符串
  44.         QString telephone = array_object.value("telephone").toString();
  45.         std::cout << "手机号: " << telephone.toStdString() << std::endl;
  46.         // 定位外层数组
  47.         QJsonArray root_array = array_object.find("path").value().toArray();
  48.         std::cout << "外层循环计数: " << root_array.count() << std::endl;
  49.         for(int index=0; index < root_array.count(); index++)
  50.         {
  51.             // 定位内层数组
  52.             QJsonArray sub_array = root_array.at(index).toArray();
  53.             std::cout << "内层循环计数: "<< sub_array.count() << std::endl;
  54.             for(int sub_count=0; sub_count < sub_array.count(); sub_count++)
  55.             {
  56.                 // 每次取出最里层数组元素
  57.                 float var = sub_array.toVariantList().at(sub_count).toFloat();
  58.                 std::cout << "输出元素: " << var << std::endl;
  59.                 // std::cout << sub_array.toVariantList().at(0).toFloat() << std::endl;
  60.             }
  61.         }
  62.     }
  63.     return a.exec();
  64. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/595698
推荐阅读
相关标签
  

闽ICP备14008679号