详解Qt中的JSON操作

embedded/2024/10/20 1:21:19/

JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简洁的结构、易读性以及与多种编程语言的良好兼容性,在现代Web服务、API交互以及数据持久化场景中得到了广泛应用。Qt作为一款功能强大的跨平台应用开发框架,自Qt 5.0起便内置了对JSON的支持,提供了方便的C++ API供开发者进行JSON数据的生成、解析、操作与序列化。本篇博文将首先回顾JSON的基础知识,随后详细介绍Qt中如何对复杂JSON进行组织与读写,并辅以详细的C++示例代码。

一、JSON基础知识

1. JSON对象

JSON对象是由一组键值对构成的数据结构,每个键(key)是字符串,值(value)可以是以下几种类型之一:

  • 字符串(string)
  • 数字(number)
  • 布尔值(boolean)
  • null
  • 另一个JSON对象
  • JSON数组

JSON对象以花括号 {} 包裹,键值对之间用逗号 , 分隔,键与对应的值之间以冒号 : 分隔。例如:

json">{"name": "John Doe","age": 30,"isEmployed": true,"address": {"street": "123 Main St.","city": "Anytown","country": "USA"}
}

2. JSON数组

JSON数组是一系列有序的值的集合,其元素可以是上述提到的任何JSON类型,包括其他数组或对象。数组以方括号 [] 包裹,元素之间用逗号 , 分隔。例如:

json">["Apple","Banana","Cherry",{"id": 1,"color": "Red"},[x1, x2, x3]
]

注:复杂的json中,数组的元素也可以是JSON对象,然后层层嵌套。

二、Qt中JSON的组织与读写

Qt提供了以下几个关键类来处理JSON数据:

  • QJsonObject: 表示JSON对象,封装了键值对的管理。
  • QJsonArray: 表示JSON数组,实现了动态大小的值列表。
  • QJsonValue: 封装了JSON支持的数据类型,包括字符串、数字、布尔值、null、对象和数组。
  • QJsonDocument: 代表整个JSON文档,负责从/向UTF-8文本或Qt内部二进制格式进行序列化与反序列化。

1. 生成JSON数据

以下示例展示了如何使用Qt创建一个复杂的JSON对象,包含嵌套对象和数组:

#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>QJsonObject createComplexJSONObject() {QJsonObject personObject;personObject["name"] = "John Doe";personObject["age"] = 30;personObject["isEmployed"] = true;QJsonObject addressObject;addressObject["street"] = "123 Main St.";addressObject["city"] = "Anytown";addressObject["country"] = "USA";personObject["address"] = addressObject;QJsonArray hobbiesArray;hobbiesArray.append("Reading");hobbiesArray.append("Gaming");personObject["hobbies"] = hobbiesArray;return personObject;
}int main() {QJsonObject person = createComplexJSONObject();QJsonDocument document(person);// 输出JSON字符串QString jsonString = document.toJson(QJsonDocument::Indented);qDebug() << "Generated JSON:\n" << jsonString;return 0;
}

2. 解析JSON数据

给定一个JSON字符串,我们可以使用Qt轻松将其解析为相应的对象或数组结构:

#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>void parseAndPrintJSON(const QString &jsonString) {QJsonParseError error;QJsonDocument document = QJsonDocument::fromJson(jsonString.toUtf8(), &error);if (error.error != QJsonParseError::NoError) {qCritical() << "JSON parsing error: " << error.errorString();return;}if (document.isObject()) {QJsonObject object = document.object();for (auto it = object.begin(); it != object.end(); ++it) {const QString key = it.key();qDebug() << "Key: " << key;}qDebug()<<"name:"<<object.value("name").toString();qDebug()<<"age:"<<object.value("age").toInt();qDebug()<<"skill:"<<object.value("skills").toArray();qDebug()<<"projects:"<<object.value("projects").toArray();}
}int main() {const QString jsonString = R"({"name": "Jane Smith","age": 35,"skills": ["Programming", "Design"],"projects": [{"title": "Project A", "status": "ongoing"},{"title": "Project B", "status": "completed"}]})";parseAndPrintJSON(jsonString);return 0;
}

3. 访问与修改JSON数据

Qt提供的类提供了丰富的接口来访问和修改已解析的JSON数据。以下示例展示了如何查询、添加、更新和删除JSON对象中的键值对:

#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>void manipulateJSON(QJsonObject &person) {// 查询值bool isEmployed = person["isEmployed"].toBool();qDebug() << "Is employed: " << isEmployed;// 添加键值对person["favoriteColor"] = "Blue";// 更新现有值person["age"] = 31;// 删除键值对person.remove("hobbies");// 修改嵌套对象QJsonObject address = person["address"].toObject();address["city"] = "New City";person["address"] = address;
}int main() {QJsonObject personObject;personObject["name"] = "John Doe";personObject["age"] = 30;personObject["isEmployed"] = true;QJsonObject addressObject;addressObject["street"] = "123 Main St.";addressObject["city"] = "Anytown";addressObject["country"] = "USA";personObject["address"] = addressObject;QJsonArray hobbiesArray;hobbiesArray.append("Reading");hobbiesArray.append("Gaming");personObject["hobbies"] = hobbiesArray;manipulateJSON(personObject);QJsonDocument updatedDoc(personObject);QString updatedJson = updatedDoc.toJson(QJsonDocument::Indented);qDebug() << "Updated JSON:\n" << updatedJson;return 0;
}

三、总结

Qt框架通过QJsonObjectQJsonArrayQJsonValueQJsonDocument类为开发者提供了完整的JSON处理能力。无论是构建复杂的JSON结构,解析来自外部源的JSON数据,还是对已有的JSON进行查询、更新与删除操作,Qt的API都提供了直观且高效的解决方案。掌握这些工具将极大地简化Qt应用程序中与JSON数据相关的任务,使其能够无缝地与其他系统和服务进行数据交换。


http://www.ppmy.cn/embedded/3889.html

相关文章

架构权衡评估方法(ATAM):一种用于软件架构评估的方法,全称为Architecture Tradeoff Analysis Method

架构权衡评估方法(ATAM)是一种用于软件架构评估的方法,全称为Architecture Tradeoff Analysis Method。它由卡梅隆大学软件工程协会提出,旨在通过分析软件系统的各种架构特征,对系统进行全面的评估,以便在各种可能的方案中做出最佳的决策13。ATAM的核心是结合质量属性效用…

Golang | Leetcode Golang题解之第32题最长有效括号

题目&#xff1a; 题解&#xff1a; func longestValidParentheses(s string) int {left, right, maxLength : 0, 0, 0for i : 0; i < len(s); i {if s[i] ( {left} else {right}if left right {maxLength max(maxLength, 2 * right)} else if right > left {left, r…

win11家庭中文版安装docker遇到Hyper-V启用失败,如何解决??

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

ubuntu中可以查看照片的程序

ubuntu中可以查看照片的程序 在Ubuntu中&#xff0c;您可以使用多种图片查看器来查看照片。以下是几个常用的图片查看器&#xff1a; GIMP GIMP是一个免费的开源图片编辑器&#xff0c;它也可以用来查看和打印图片。 安装命令&#xff1a; sudo apt-get update sudo apt-ge…

优化汽车制造中的库存管理

在拥有足够的库存以满足客户需求和最大限度地减少过剩库存之间取得适当的平衡&#xff0c;对于高效运营和正向现金流运营至关重要。我们将探讨如何利用数据见解和预测技术来支持汽车制造商进行精益运营&#xff0c;避免库存过多或不足的缺陷。 销售模式告诉我们什么&#xff1…

软考127-上午题-【软件工程】-McCabe度量法

一、McCabe度量法 1-1、定义 McCabe 度量法是通过定义环路复杂度&#xff0c;建立程序复杂性的度量。 它基于一个程序模块的程序图中环路的个数。计算有向图G的环路复杂性的公式为&#xff1a; V(G) m - n 2 闭合区域 1 其中V(G)是有向图 G 中的环路个数&#xff0c;m 是…

Kafka

Kafka是一个开源的分布式事件流平台&#xff0c;广泛应用于大数据实时处理领域。关于Kafka的问题可能涉及多个方面&#xff0c;包括但不限于其定义、应用场景、功能更新等。以下是一些可能的Kafka问题及相应的答案&#xff1a; 1&#xff1a;Kafka是什么&#xff1f; 答案1&a…

【C++风云录】五款 C++ 库的探索与应用:物联网、嵌入式与数据处理

提升你的C技能&#xff1a;五个关键库的使用与指南 前言 在今天的数字化世界里&#xff0c;C 作为一种强大且快速的编程语言&#xff0c;在各类复杂系统和应用的开发中扮演着重要角色。然而&#xff0c;单凭语言本身的能力&#xff0c;我们往往无法实现所有的功能需求&#x…