在 Qt 中处理 JSON 数据非常方便,Qt 提供了 QJsonDocument
、QJsonObject
、QJsonArray
、QJsonValue
等类来处理 JSON 数据。下面是一个简单的代码示例,演示如何解析 JSON 字符串、修改 JSON 数据并将其转换回字符串。
示例代码
1. JSON 字符串解析
假设我们有以下 JSON 字符串:
{
"name": "John Doe",
"age": 30,
"isEmployed": true,
"skills": ["C++", "Qt", "JSON"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"country": "Anycountry"
}
}
我们可以使用 Qt 的 JSON 处理类来解析这个字符串。
2. 解析 JSON 字符串的代码
cpp
#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// JSON 字符串
QString jsonString = R"(
{
"name": "John Doe",
"age": 30,
"isEmployed": true,
"skills": ["C++", "Qt", "JSON"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"country": "Anycountry"
}
}
)";
// 解析 JSON 字符串
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());
// 检查是否解析成功
if (!jsonDoc.isNull()) {
qDebug() << "JSON parsed successfully!";
} else {
qWarning() << "Failed to parse JSON!";
return -1;
}
// 获取 JSON 对象
QJsonObject jsonObj = jsonDoc.object();
// 访问数据
QString name = jsonObj["name"].toString();
int age = jsonObj["age"].toInt();
bool isEmployed = jsonObj["isEmployed"].toBool();
QJsonArray skills = jsonObj["skills"].toArray();
QJsonObject address = jsonObj["address"].toObject();
qDebug() << "Name:" << name;
qDebug() << "Age:" << age;
qDebug() << "Employed:" << isEmployed;
// 输出技能列表
qDebug() << "Skills:";
for (const QJsonValue &value : skills) {
qDebug() << " -" << value.toString();
}
// 输出地址信息
qDebug() << "Address:";
qDebug() << " Street:" << address["street"].toString();
qDebug() << " City:" << address["city"].toString();
qDebug() << " Country:" << address["country"].toString();
// 修改 JSON 数据
jsonObj["age"] = 31; // 更新年龄
jsonObj["skills"].toArray().append("QML"); // 添加一个新技能
// 将 JSON 对象转换回 JSON 字符串
QJsonDocument newJsonDoc(jsonObj);
QString modifiedJsonString = newJsonDoc.toJson(QJsonDocument::Indented);
qDebug() << "Modified JSON String:" << modifiedJsonString;
return a.exec();
}
代码说明
-
解析 JSON 字符串:
- 使用
QJsonDocument::fromJson
将 JSON 字符串解析为QJsonDocument
。 - 使用
jsonDoc.object()
获取根QJsonObject
,可以从中访问各个键值对。
- 使用
-
访问 JSON 数据:
- 使用
QJsonObject::value(key)
获取值,并根据需要将其转换为相应的类型(如QString
、int
、bool
等)。 - 使用
QJsonArray
访问数组中的元素。
- 使用
-
修改 JSON 数据:
- 通过赋值更新 JSON 对象中的键值对。
- 使用
QJsonArray::append
方法向数组中添加新元素。
-
转换回 JSON 字符串:
- 使用
QJsonDocument::toJson
将QJsonObject
转换回 JSON 字符串,QJsonDocument::Indented
参数用于生成带缩进的格式化字符串。
- 使用
运行结果
cpp
JSON parsed successfully!
Name: "John Doe"
Age: 30
Employed: true
Skills:
- "C++"
- "Qt"
- "JSON"
Address:
Street: "123 Main St"
City: "Anytown"
Country: "Anycountry"
Modified JSON String: "{
"name": "John Doe",
"age": 31,
"isEmployed": true,
"skills": [
"C++",
"Qt",
"JSON",
"QML"
],
"address": {
"street": "123 Main St",
"city": "Anytown",
"country": "Anycountry"
}
}"
总结
通过这个示例,你学会了如何在 Qt 中解析、访问、修改和生成 JSON 数据。Qt 提供的 JSON 处理类非常直观,使用这些类可以轻松地处理复杂的 JSON 结构。