Qt QJsonObject
Qt
- 📦 QJsonObject 详解
- 🏛 什么是 QJsonObject?
- ⚡ QJsonObject 的本质
- 🛠️ 核心特性
- 📝 基本操作示例
- 🔧 创建与初始化
- 🔍 访问与修改
- 📦 嵌套使用(JSON 对象嵌套)
- ✅ 与其他 JSON 类的关系
- ❌ 常见注意事项
- 🏊 典型应用场景
📦 QJsonObject 详解
🏛 什么是 QJsonObject?
QJsonObject 是 Qt6 中处理 JSON 数据的核心类之一,用于表示 JSON 中的对象类型(即由键值对组成的无序集合)。它继承自 QJsonValue,是 Qt 对 JSON 规范中「对象(Object)」的具体实现,支持对键值对的增删改查等操作。
⚡ QJsonObject 的本质
- 数据结构本质:本质上是一个键值对的无序映射(类似 C++ 标准库的
std::unordered_map<QString, QJsonValue>
),键为字符串类型(QString
),值为QJsonValue
类型(可表示字符串、数字、布尔、数组、对象等 JSON 支持的数据类型)。 - 内存管理:内部维护动态数组存储键值对,自动处理内存分配与释放,无需手动管理。
- JSON 规范映射:严格遵循 JSON 规范,仅支持 JSON 定义的基础数据类型,确保与其他 JSON 解析器的兼容性。
🛠️ 核心特性
- 🔑 键唯一:每个键在 QJsonObject 中唯一,重复添加会覆盖原有值。
- 🔄 动态伸缩:支持动态添加/删除键值对,大小随内容自动调整。
- 🔗 类型兼容:值(QJsonValue)可兼容字符串、数字、布尔、QJsonArray、嵌套 QJsonObject 等。
- 📤 序列化支持:可直接转换为 JSON 格式字符串(通过
QJsonDocument
),或从字符串解析生成。
📝 基本操作示例
🔧 创建与初始化
#include <QJsonObject>
#include <QJsonValue>// 方法1:直接构造
QJsonObject obj;
obj["name"] = "Qt";
obj["version"] = 6.5;
obj["is_stable"] = true;// 方法2:使用初始化列表(Qt6支持)
QJsonObject obj2 = {{"name", "Qt"},{"version", 6.5},{"is_stable", true}
};
🔍 访问与修改
// 获取值(返回QJsonValue)
QJsonValue nameVal = obj["name"];
double version = obj["version"].toDouble(); // 转换为具体类型// 修改值
obj["version"] = 6.6;// 判断键是否存在
if (obj.contains("is_stable")) {bool stable = obj["is_stable"].toBool();
}// 删除键值对
obj.remove("is_stable");
📦 嵌套使用(JSON 对象嵌套)
// 嵌套QJsonObject
QJsonObject subObj;
subObj["major"] = 6;
subObj["minor"] = 6;QJsonObject mainObj;
mainObj["version"] = subObj; // 将子对象作为值添加// 访问嵌套对象
int minorVersion = mainObj["version"].toObject()["minor"].toInt(); // 结果为6
✅ 与其他 JSON 类的关系
-
依赖 QJsonValue:QJsonObject 的值必须是 QJsonValue 类型,通过它兼容不同数据类型。
-
配合 QJsonDocument:需通过
QJsonDocument
进行序列化(toJson()
)或反序列化(fromJson()
):// 序列化:QJsonObject → JSON字符串 QJsonDocument doc(obj); QByteArray jsonData = doc.toJson(QJsonDocument::Indented); // 带缩进的格式化输出// 反序列化:JSON字符串 → QJsonObject QJsonObject parsedObj = QJsonDocument::fromJson(jsonData).object();
-
与 QJsonArray 交互:QJsonArray 可包含 QJsonObject,实现 JSON 数组嵌套对象的结构。
❌ 常见注意事项
- 键的类型限制:键必须是
QString
,不能为数字或其他类型(遵循 JSON 规范)。 - 类型转换安全:使用
toXxx()
方法(如toInt()
、toObject()
)时,需确保值的类型匹配,否则返回默认值(如 0、空对象)。 - 性能考量:大规模 JSON 操作时,建议批量构建后再处理,避免频繁修改。
🏊 典型应用场景
- 解析 API 响应:处理后端返回的 JSON 格式数据。
- 配置文件读写:将配置信息以 JSON 格式存储,通过 QJsonObject 解析/生成。
- 数据交换:在进程间或网络传输中,以 JSON 格式封装数据。