一、核心类库及功能
Qt 提供了一套完整的 JSON 处理类库(位于 QtCore
模块),支持解析和生成 JSON 数据:
- QJsonDocument:表示完整的 JSON 文档,支持从
QJsonObject
或QJsonArray
初始化。 - QJsonObject:用于构建和操作键值对结构的 JSON 对象,支持插入、查询、删除键值对。
- QJsonArray:处理有序值集合的 JSON 数组,可通过索引访问和修改元素。
- QJsonValue:封装 JSON 基本数据类型(字符串、数值、布尔值、空值、对象、数组)。
二、JSON 解析流程
读取文件数据
使用QFile
读取 JSON 文件并转换为QByteArray
:QFile file("data.json"); if (file.open(QIODevice::ReadOnly)) { QByteArray jsonData = file.readAll(); file.close(); }
解析为 JSON 文档
通过QJsonDocument::fromJson()
解析数据:QJsonDocument doc = QJsonDocument::fromJson(jsonData); if (doc.isNull()) { qDebug() << "解析失败"; return; }
-
提取数据内容
根据文档类型(对象或数组)获取数据:// 对象类型 QJsonObject rootObj = doc.object(); QString name = rootObj["name"].toString(); int version = rootObj["version"].toInt(); // 数组类型 QJsonArray arr = doc.array(); for (const QJsonValue &val : arr) { qDebug() << val.toString(); }
三、JSON 数据生成方法
构建数据结构
通过QJsonObject
和QJsonArray
组织数据:QJsonObject obj; obj.insert("project", "Qt Demo"); obj.insert("version", 6.5); QJsonArray plugins; plugins.append("Core"); plugins.append("GUI"); obj.insert("plugins", plugins);
生成 JSON 文档
将对象或数组封装为QJsonDocument
,并序列化为字符串:QJsonDocument doc(obj); QString jsonStr = doc.toJson(QJsonDocument::Compact); // 紧凑格式 // 或 doc.toJson(QJsonDocument::Indented); // 带缩进的格式
四、结构体与 JSON 的转换
可通过模板或宏实现结构体与 JSON 的自动转换(需借助第三方库如 x2struct
):
struct Config {
QString host;
int port;
XTOSTRUCT(O(host, port)); // 声明可序列化字段
};
// 结构体转 JSON
Config cfg{"127.0.0.1", 8080};
QString json = X::tojson(cfg); // 生成 {"host":"127.0.0.1","port":8080}
// JSON 转结构体
Config newCfg;
X::fromjson(json.toStdString(), newCfg);
五、优化与注意事项
性能优化
- 优先使用
QJsonDocument::fromJson()
,其性能在 Qt 5.15+ 中已优化。 - 处理大文件时,避免频繁操作
QJsonObject
或QJsonArray
,可分批解析。
- 优先使用
常见问题
- 键名检查:严格匹配键名大小写,避免因拼写错误导致解析失败。
- 数值精度:JSON 中数值类型为
double
,转换整数时需显式调用toInt()
。 - 嵌套结构:建议分层解析,避免深层嵌套导致代码复杂度增加。