在 Qt 中构建和剖析多层嵌套的 JSON 数据

打印 上一主题 下一主题

主题 998|帖子 998|积分 2994

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
随着当代应用程序的发展,JSON(JavaScript Object Notation)成为了前后端通信中非常常用的数据互换格式。JSON 以其轻量级、可读性强的特点广泛用于 RESTful API 以及 Web 服务的通信。对于复杂的数据结构,JSON 能够通过对象嵌套和数组嵌套来表现。在 Qt 中,我们可以利用 QJsonObject、QJsonArray 和 QJsonDocument 来构建和剖析多层嵌套的 JSON 数据。本文将详细介绍如何在 Qt 中处理惩罚这些复杂的 JSON 结构。


一. 如何剖析多层嵌套的 JSON 数据

当从服务器获取复杂的 JSON 数据时,大概会碰到多层嵌套的结构。假设服务器返回如下的嵌套 JSON 数据:
  1. {
  2.     "student": {
  3.         "name": "John",
  4.         "age": 21,
  5.         "sex": "Male",
  6.         "address": {
  7.             "city": "New York",
  8.             "zip": "10001"
  9.         }
  10.     },
  11.     "class": "Physics"
  12. }
复制代码

这种 JSON 数据包含一个 student 对象,而 student 对象内部又嵌套了一个 address 对象。为了剖析这样的 JSON 数据,我们需要递归地提取每一层的对象和字段。
剖析多层 JSON 的代码示例

  1. #include <QCoreApplication>
  2. #include <QJsonObject>
  3. #include <QJsonDocument>
  4. #include <QJsonArray>
  5. #include <QDebug>
  6. int main(int argc, char *argv[]) {
  7.     QCoreApplication a(argc, argv);
  8.     // 模拟一个多层的 JSON 响应
  9.     QByteArray jsonResponse = R"({
  10.         "student": {
  11.             "name": "John",
  12.             "age": 21,
  13.             "sex": "Male",
  14.             "address": {
  15.                 "city": "New York",
  16.                 "zip": "10001"
  17.             }
  18.         },
  19.         "class": "Physics"
  20.     })";
  21.     // 解析 JSON 文档
  22.     QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonResponse);
  23.     if (jsonDoc.isObject()) {
  24.         QJsonObject rootObject = jsonDoc.object();
  25.         // 获取 'student' 对象
  26.         if (rootObject.contains("student") && rootObject["student"].isObject()) {
  27.             QJsonObject studentObject = rootObject["student"].toObject();
  28.             // 提取 'name' 字段
  29.             if (studentObject.contains("name") && studentObject["name"].isString()) {
  30.                 QString name = studentObject["name"].toString();
  31.                 qDebug() << "Student Name:" << name;
  32.             }
  33.             // 提取 'age' 字段
  34.             if (studentObject.contains("age") && studentObject["age"].isDouble()) {
  35.                 int age = studentObject["age"].toInt();
  36.                 qDebug() << "Student Age:" << age;
  37.             }
  38.             // 提取 'sex' 字段
  39.             if (studentObject.contains("sex") && studentObject["sex"].isString()) {
  40.                 QString sex = studentObject["sex"].toString();
  41.                 qDebug() << "Student Sex:" << sex;
  42.             }
  43.             // 提取嵌套的 'address' 对象
  44.             if (studentObject.contains("address") && studentObject["address"].isObject()) {
  45.                 QJsonObject addressObject = studentObject["address"].toObject();
  46.                 if (addressObject.contains("city") && addressObject["city"].isString()) {
  47.                     QString city = addressObject["city"].toString();
  48.                     qDebug() << "City:" << city;
  49.                 }
  50.                 if (addressObject.contains("zip") && addressObject["zip"].isString()) {
  51.                     QString zip = addressObject["zip"].toString();
  52.                     qDebug() << "ZIP Code:" << zip;
  53.                 }
  54.             }
  55.         }
  56.         // 获取根级字段 'class'
  57.         if (rootObject.contains("class") && rootObject["class"].isString()) {
  58.             QString className = rootObject["class"].toString();
  59.             qDebug() << "Class:" << className;
  60.         }
  61.     }
  62.     return a.exec();
  63. }
复制代码
剖析步骤说明


  • 加载 JSON 文档:利用 QJsonDocument::fromJson() 将 JSON 数据转换为 QJsonDocument。
  • 判定 JSON 范例:检查 QJsonDocument 是否是对象范例,通过 jsonDoc.object() 提取根对象。
  • 递归剖析对象:对嵌套的对象逐层剖析,如提取 student 对象中的 name、age 等字段。
  • 剖析嵌套对象:通过 studentObject["address"].toObject() 获取嵌套的 address 对象,然后进一步提取其中的字段。
  • 剖析顶层字段:提取 class 这样的根级字段与嵌套对象的剖析方法类似。

二. 如何构建多层嵌套的 JSON 数据

构建多层嵌套的 JSON 数据与剖析类似,通过 QJsonObject 和 QJsonArray 可以轻松构建复杂的 JSON 结构。例如,我们构建一个嵌套的 JSON,如下所示:
  1. {
  2.     "student": {
  3.         "name": "John",
  4.         "age": 21,
  5.         "sex": "Male",
  6.         "address": {
  7.             "city": "New York",
  8.             "zip": "10001"
  9.         }
  10.     },
  11.     "class": "Physics"
  12. }
复制代码
构建多层嵌套 JSON 的代码示例

  1. [/code] [code]#include <QCoreApplication>
  2. #include <QJsonObject>
  3. #include <QJsonDocument>
  4. #include <QDebug>
  5. int main(int argc, char *argv[]) {
  6.     QCoreApplication a(argc, argv);
  7.     // 创建最里面的 address 对象
  8.     QJsonObject addressObject;
  9.     addressObject["city"] = "New York";
  10.     addressObject["zip"] = "10001";
  11.     // 创建 student 对象,并包含 name、age、sex 以及 address
  12.     QJsonObject studentObject;
  13.     studentObject["name"] = "John";
  14.     studentObject["age"] = 21;
  15.     studentObject["sex"] = "Male";
  16.     studentObject["address"] = addressObject; // 嵌套的 address 对象
  17.     // 创建根对象,并包含 student 对象和 class 字段
  18.     QJsonObject rootObject;
  19.     rootObject["student"] = studentObject;
  20.     rootObject["class"] = "Physics";
  21.     // 将 JSON 对象转换为 QJsonDocument
  22.     QJsonDocument jsonDoc(rootObject);
  23.     // 输出 JSON 字符串
  24.     QByteArray jsonData = jsonDoc.toJson();
  25.     qDebug() << jsonData;
  26.     return a.exec();
  27. }
复制代码
构建步骤说明


  • 创建嵌套对象:首先创建最内层的 address 对象,然后将其嵌入到 student 对象中。
  • 创建中心对象:在 studentObject 中添加 name、age、sex 字段,并嵌入 addressObject。
  • 创建根对象:将 studentObject 和 class 添加到根对象 rootObject 中。
  • 转换为 JSON 字符串:通过 QJsonDocument::toJson() 将构建好的 JSON 对象序列化为字符串或 QByteArray。

三. 构建包含数组的多层 JSON 数据

偶然,JSON 结构大概包含数组。你可以利用 QJsonArray 来表现 JSON 数组。例如,构建一个包含多个学生的 JSON 数据,每个学生都有一个嵌套的 address 对象:
  1. {
  2.     "class": "Physics",
  3.     "students": [
  4.         {
  5.             "name": "John",
  6.             "age": 21,
  7.             "sex": "Male",
  8.             "address": {
  9.                 "city": "New York",
  10.                 "zip": "10001"
  11.             }
  12.         },
  13.         {
  14.             "name": "Alice",
  15.             "age": 22,
  16.             "sex": "Female",
  17.             "address": {
  18.                 "city": "Los Angeles",
  19.                 "zip": "90001"
  20.             }
  21.         }
  22.     ]
  23. }
复制代码
构建包含数组的 JSON 的代码示例

  1. [/code] [code]#include <QCoreApplication>
  2. #include <QJsonObject>
  3. #include <QJsonArray>
  4. #include <QJsonDocument>
  5. #include <QDebug>
  6. int main(int argc, char *argv[]) {
  7.     QCoreApplication a(argc, argv);
  8.     // 创建第一个学生的 address 对象
  9.     QJsonObject addressObject1;
  10.     addressObject1["city"] = "New York";
  11.     addressObject1["zip"] = "10001";
  12.     // 创建第一个 student 对象
  13.     QJsonObject studentObject1;
  14.     studentObject1["name"] = "John";
  15.     studentObject1["age"] = 21;
  16.     studentObject1["sex"] = "Male";
  17.     studentObject1["address"] = addressObject1;
  18.     // 创建第二个学生的 address 对象
  19.     QJsonObject addressObject2;
  20.     addressObject2["city"] = "Los Angeles";
  21.     addressObject2["zip"] = "90001";
  22.     // 创建第二个 student 对象
  23.     QJsonObject studentObject2;
  24.     studentObject2["name"] = "Alice";
  25.     studentObject2["age"] = 22;
  26.     studentObject2["sex"] = "Female";
  27.     studentObject2["address"] = addressObject2;
  28.     // 创建 students 数组
  29.     QJsonArray studentsArray;
  30.     studentsArray.append(studentObject1);
  31.     studentsArray.append(studentObject2);
  32.     // 创建根对象
  33.     QJsonObject rootObject;
  34.     rootObject["class"] = "Physics";
  35.     rootObject["students"] = studentsArray;
  36.     // 输出 JSON 字符串
  37.     QJsonDocument jsonDoc(rootObject);
  38.     QByteArray jsonData = jsonDoc.toJson();
  39.     qDebug() << jsonData;
  40.     return a.exec();
  41. }
复制代码
构建步骤说明


  • 创建多个对象:为每个学生创建一个 studentObject,并嵌入对应的 addressObject。
  • 创建数组:利用 QJsonArray 存储多个 studentObject。
  • 将数组嵌入根对象:将 studentsArray 嵌入到 rootObject 中,构建完备的 JSON 数据。

总结

Qt 提供了强大的 JSON 剖析与构建工具,通过 QJsonObject、QJsonArray 和 QJsonDocument,你可以轻松处理惩罚复杂的嵌套 JSON 结构。无论是从服务器获取多层嵌套的 JSON 数据并进行剖析,还是构建复杂的 JSON 数据并发送给服务器,Qt 都能很好地支持这一流程。


  • 剖析 JSON:通过递归访问 QJsonObject,逐层提取数据,确保范例匹配以避免错误。
  • 构建 JSON:通过嵌套对象和数组来构建复杂的 JSON 结构,将其序列化为 QByteArray 或字符串以用于通信或存储。
利用 Qt 处理惩罚 JSON 数据,你可以方便地与 RESTful API 和 Web 服务进行交互,实现当代应用程序所需的复杂数据操纵。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表