赞
踩
JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简洁的结构、易读性以及与多种编程语言的良好兼容性,在现代Web服务、API交互以及数据持久化场景中得到了广泛应用。Qt作为一款功能强大的跨平台应用开发框架,自Qt 5.0起便内置了对JSON的支持,提供了方便的C++ API供开发者进行JSON数据的生成、解析、操作与序列化。本篇博文将首先回顾JSON的基础知识,随后详细介绍Qt中如何对复杂JSON进行组织与读写,并辅以详细的C++示例代码。
JSON对象是由一组键值对构成的数据结构,每个键(key)是字符串,值(value)可以是以下几种类型之一:
JSON对象以花括号 {}
包裹,键值对之间用逗号 ,
分隔,键与对应的值之间以冒号 :
分隔。例如:
{
"name": "John Doe",
"age": 30,
"isEmployed": true,
"address": {
"street": "123 Main St.",
"city": "Anytown",
"country": "USA"
}
}
JSON数组是一系列有序的值的集合,其元素可以是上述提到的任何JSON类型,包括其他数组或对象。数组以方括号 []
包裹,元素之间用逗号 ,
分隔。例如:
[
"Apple",
"Banana",
"Cherry",
{
"id": 1,
"color": "Red"
},
[
x1, x2, x3
]
]
注:复杂的json中,数组的元素也可以是JSON对象,然后层层嵌套。
Qt提供了以下几个关键类来处理JSON数据:
QJsonObject
: 表示JSON对象,封装了键值对的管理。QJsonArray
: 表示JSON数组,实现了动态大小的值列表。QJsonValue
: 封装了JSON支持的数据类型,包括字符串、数字、布尔值、null、对象和数组。QJsonDocument
: 代表整个JSON文档,负责从/向UTF-8文本或Qt内部二进制格式进行序列化与反序列化。以下示例展示了如何使用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;
}
给定一个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;
}
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框架通过QJsonObject
、QJsonArray
、QJsonValue
和QJsonDocument
类为开发者提供了完整的JSON处理能力。无论是构建复杂的JSON结构,解析来自外部源的JSON数据,还是对已有的JSON进行查询、更新与删除操作,Qt的API都提供了直观且高效的解决方案。掌握这些工具将极大地简化Qt应用程序中与JSON数据相关的任务,使其能够无缝地与其他系统和服务进行数据交换。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。