当前位置: 首页 > news >正文

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

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


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

当从服务器获取复杂的 JSON 数据时,可能会遇到多层嵌套的结构。假设服务器返回如下的嵌套 JSON 数据:

{"student": {"name": "John","age": 21,"sex": "Male","address": {"city": "New York","zip": "10001"}},"class": "Physics"
}

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

解析多层 JSON 的代码示例
#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 模拟一个多层的 JSON 响应QByteArray jsonResponse = R"({"student": {"name": "John","age": 21,"sex": "Male","address": {"city": "New York","zip": "10001"}},"class": "Physics"})";// 解析 JSON 文档QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonResponse);if (jsonDoc.isObject()) {QJsonObject rootObject = jsonDoc.object();// 获取 'student' 对象if (rootObject.contains("student") && rootObject["student"].isObject()) {QJsonObject studentObject = rootObject["student"].toObject();// 提取 'name' 字段if (studentObject.contains("name") && studentObject["name"].isString()) {QString name = studentObject["name"].toString();qDebug() << "Student Name:" << name;}// 提取 'age' 字段if (studentObject.contains("age") && studentObject["age"].isDouble()) {int age = studentObject["age"].toInt();qDebug() << "Student Age:" << age;}// 提取 'sex' 字段if (studentObject.contains("sex") && studentObject["sex"].isString()) {QString sex = studentObject["sex"].toString();qDebug() << "Student Sex:" << sex;}// 提取嵌套的 'address' 对象if (studentObject.contains("address") && studentObject["address"].isObject()) {QJsonObject addressObject = studentObject["address"].toObject();if (addressObject.contains("city") && addressObject["city"].isString()) {QString city = addressObject["city"].toString();qDebug() << "City:" << city;}if (addressObject.contains("zip") && addressObject["zip"].isString()) {QString zip = addressObject["zip"].toString();qDebug() << "ZIP Code:" << zip;}}}// 获取根级字段 'class'if (rootObject.contains("class") && rootObject["class"].isString()) {QString className = rootObject["class"].toString();qDebug() << "Class:" << className;}}return a.exec();
}
解析步骤说明
  1. 加载 JSON 文档:使用 QJsonDocument::fromJson() 将 JSON 数据转换为 QJsonDocument
  2. 判断 JSON 类型:检查 QJsonDocument 是否是对象类型,通过 jsonDoc.object() 提取根对象。
  3. 递归解析对象:对嵌套的对象逐层解析,如提取 student 对象中的 nameage 等字段。
  4. 解析嵌套对象:通过 studentObject["address"].toObject() 获取嵌套的 address 对象,然后进一步提取其中的字段。
  5. 解析顶层字段:提取 class 这样的根级字段与嵌套对象的解析方法类似。

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

构建多层嵌套的 JSON 数据与解析类似,通过 QJsonObjectQJsonArray 可以轻松构建复杂的 JSON 结构。例如,我们构建一个嵌套的 JSON,如下所示:

{"student": {"name": "John","age": 21,"sex": "Male","address": {"city": "New York","zip": "10001"}},"class": "Physics"
}
构建多层嵌套 JSON 的代码示例
 
#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonDocument>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 创建最里面的 address 对象QJsonObject addressObject;addressObject["city"] = "New York";addressObject["zip"] = "10001";// 创建 student 对象,并包含 name、age、sex 以及 addressQJsonObject studentObject;studentObject["name"] = "John";studentObject["age"] = 21;studentObject["sex"] = "Male";studentObject["address"] = addressObject; // 嵌套的 address 对象// 创建根对象,并包含 student 对象和 class 字段QJsonObject rootObject;rootObject["student"] = studentObject;rootObject["class"] = "Physics";// 将 JSON 对象转换为 QJsonDocumentQJsonDocument jsonDoc(rootObject);// 输出 JSON 字符串QByteArray jsonData = jsonDoc.toJson();qDebug() << jsonData;return a.exec();
}
构建步骤说明
  1. 创建嵌套对象:首先创建最内层的 address 对象,然后将其嵌入到 student 对象中。
  2. 创建中间对象:在 studentObject 中添加 nameagesex 字段,并嵌入 addressObject
  3. 创建根对象:将 studentObjectclass 添加到根对象 rootObject 中。
  4. 转换为 JSON 字符串:通过 QJsonDocument::toJson() 将构建好的 JSON 对象序列化为字符串或 QByteArray

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

有时,JSON 结构可能包含数组。你可以使用 QJsonArray 来表示 JSON 数组。例如,构建一个包含多个学生的 JSON 数据,每个学生都有一个嵌套的 address 对象:

{"class": "Physics","students": [{"name": "John","age": 21,"sex": "Male","address": {"city": "New York","zip": "10001"}},{"name": "Alice","age": 22,"sex": "Female","address": {"city": "Los Angeles","zip": "90001"}}]
}
构建包含数组的 JSON 的代码示例
 
#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 创建第一个学生的 address 对象QJsonObject addressObject1;addressObject1["city"] = "New York";addressObject1["zip"] = "10001";// 创建第一个 student 对象QJsonObject studentObject1;studentObject1["name"] = "John";studentObject1["age"] = 21;studentObject1["sex"] = "Male";studentObject1["address"] = addressObject1;// 创建第二个学生的 address 对象QJsonObject addressObject2;addressObject2["city"] = "Los Angeles";addressObject2["zip"] = "90001";// 创建第二个 student 对象QJsonObject studentObject2;studentObject2["name"] = "Alice";studentObject2["age"] = 22;studentObject2["sex"] = "Female";studentObject2["address"] = addressObject2;// 创建 students 数组QJsonArray studentsArray;studentsArray.append(studentObject1);studentsArray.append(studentObject2);// 创建根对象QJsonObject rootObject;rootObject["class"] = "Physics";rootObject["students"] = studentsArray;// 输出 JSON 字符串QJsonDocument jsonDoc(rootObject);QByteArray jsonData = jsonDoc.toJson();qDebug() << jsonData;return a.exec();
}
构建步骤说明
  1. 创建多个对象:为每个学生创建一个 studentObject,并嵌入对应的 addressObject
  2. 创建数组:使用 QJsonArray 存储多个 studentObject
  3. 将数组嵌入根对象:将 studentsArray 嵌入到 rootObject 中,构建完整的 JSON 数据。

总结

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

  • 解析 JSON:通过递归访问 QJsonObject,逐层提取数据,确保类型匹配以避免错误。
  • 构建 JSON:通过嵌套对象和数组来构建复杂的 JSON 结构,将其序列化为 QByteArray 或字符串以用于通信或存储。

使用 Qt 处理 JSON 数据,你可以方便地与 RESTful API 和 Web 服务进行交互,实现现代应用程序所需的复杂数据操作。

相关文章:

  • 通信工程学习:什么是SISO单入单出
  • GEE问题: 离校后学校edu账户无法使用,如何导出我们所有的脚本
  • C#通用文档识别挂接示例、手写体识别接口
  • 昇思MindSpore进阶教程--报错分析
  • AJAX(简介以及一些用法)
  • (笔记)第三期书生·浦语大模型实战营(十一卷王场)--书生入门岛通关第1关Linux 基础知识
  • [RabbitMQ] 7种工作模式详细介绍
  • 一文上手SpringSecurity【七】
  • 怎么查看网站是否被谷歌收录,查看网站是否被搜索引擎收录5个方法与步骤
  • 傅里叶级数在机器人中的应用(动力学参数辨识)
  • Kotlin高阶函数func
  • 二值图像的面积求取的两种方法及MATLAB实现
  • 【漏洞复现】VEXUS多语言货币交易所存在未授权访问漏洞
  • Java五子棋
  • Centos/fedora/openEuler 终端中文显示配置
  • 【Amaple教程】5. 插件
  • Android系统模拟器绘制实现概述
  • Angular6错误 Service: No provider for Renderer2
  • classpath对获取配置文件的影响
  • Docker下部署自己的LNMP工作环境
  • echarts的各种常用效果展示
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript中的对象个人分享
  • JAVA并发编程--1.基础概念
  • js递归,无限分级树形折叠菜单
  • JS数组方法汇总
  • Promise初体验
  • React 快速上手 - 07 前端路由 react-router
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 全栈开发——Linux
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 最简单的无缝轮播
  • const的用法,特别是用在函数前面与后面的区别
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​补​充​经​纬​恒​润​一​面​
  • ​人工智能书单(数学基础篇)
  • "无招胜有招"nbsp;史上最全的互…
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • ###C语言程序设计-----C语言学习(6)#
  • (26)4.7 字符函数和字符串函数
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (二十四)Flask之flask-session组件
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (转)视频码率,帧率和分辨率的联系与区别
  • *1 计算机基础和操作系统基础及几大协议
  • .net framework 4.8 开发windows系统服务
  • .NET 回调、接口回调、 委托