在Qt C++中处理JSON数据主要依赖QJsonDocument、QJsonObject、QJsonArray和QJsonValue等核心类。以下从解析、生成、修改和文件操作四个维度详细说明,并提供可直接运行的代码示例:
1. JSON解析
// 解析JSON字符串
QString jsonStr = R"({"name":"John", "age":30, "tags":["cpp","qt"]})";
QJsonParseError err;
QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8(), &err);
if(err.error != QJsonParseError::NoError) {
qDebug() << "JSON解析错误:" << err.errorString();
return;
}
// 获取根对象
QJsonObject root = doc.object();
QString name = root["name"].toString(); // "John"
int age = root["age"].toInt(); // 30
QJsonArray tags = root["tags"].toArray(); // ["cpp","qt"]
2. JSON生成
// 构建JSON对象
QJsonObject root;
root["name"] = "Alice";
root["age"] = 25;
QJsonArray skills;
skills.append("Qt");
skills.append("C++");
root["skills"] = skills;
// 转换为JSON文档
QJsonDocument doc(root);
QString jsonStr = doc.toJson(QJsonDocument::Indented); // 格式化输出
qDebug() << jsonStr;
输出结果:
{
"name": "Alice",
"age": 25,
"skills": [
"Qt",
"C++"
]
}
3. JSON修改
// 修改现有JSON
QJsonObject obj = doc.object();
obj["age"] = 26; // 修改值
obj["newField"] = true; // 添加新字段
// 嵌套对象处理
QJsonObject address;
address["city"] = "Beijing";
obj["address"] = address;
// 转换为新JSON
QJsonDocument newDoc(obj);
4. 文件读写
// 从文件读取
QFile file("data.json");
if(!file.open(QIODevice::ReadOnly)) {
qDebug() << "文件打开失败";
return;
}
QJsonDocument doc = QJsonDocument::fromJson(file.readAll(), &err);
file.close();
// 写入文件
QFile outFile("output.json");
outFile.open(QIODevice::WriteOnly);
outFile.write(doc.toJson()); // 默认紧凑格式
outFile.close();
关键注意事项
- 类型安全:使用
QJsonValue的toString()、toInt()等方法时需确保类型匹配 - 错误处理:始终检查
QJsonParseError - 性能优化:处理大JSON时使用
QJsonParseError::NoError避免重复解析 - 版本兼容:Qt 5.0+ 均支持上述API,Qt 6无重大变更
扩展场景处理
- 自定义对象序列化:通过
Q_PROPERTY宏或手动映射字段 - 嵌套结构:使用
QJsonObject和QJsonArray组合处理复杂结构 - 流式解析:对于超大JSON文件,可使用
QJsonParser(Qt 6新增)进行增量解析
完整示例代码可直接在Qt项目中编译运行,需包含#include <QJsonDocument>等头文件。

被折叠的 条评论
为什么被折叠?



