Qt QJsonObject

Qt

  • [📦 QJsonObject 详解](#📦 QJsonObject 详解)
    • [🏛 什么是 QJsonObject?](#🏛 什么是 QJsonObject?)
    • [⚡ QJsonObject 的本质](#⚡ QJsonObject 的本质)
    • [🛠️ 核心特性](#🛠️ 核心特性)
    • [📝 基本操作示例](#📝 基本操作示例)
      • [🔧 创建与初始化](#🔧 创建与初始化)
      • [🔍 访问与修改](#🔍 访问与修改)
      • [📦 嵌套使用(JSON 对象嵌套)](#📦 嵌套使用(JSON 对象嵌套))
    • [✅ 与其他 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),或从字符串解析生成。

📝 基本操作示例

🔧 创建与初始化

cpp 复制代码
#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}
};

🔍 访问与修改

cpp 复制代码
// 获取值(返回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 对象嵌套)

cpp 复制代码
// 嵌套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()):

    cpp 复制代码
    // 序列化: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 格式封装数据。
相关推荐
一 乐5 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
码事漫谈6 小时前
Protocol Buffers 编码原理深度解析
后端
码事漫谈6 小时前
gRPC源码剖析:高性能RPC的实现原理与工程实践
后端
恋爱绝缘体16 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
Z1Jxxx7 小时前
加密算法加密算法
开发语言·c++·算法
乌萨奇也要立志学C++7 小时前
【洛谷】递归初阶 三道经典递归算法题(汉诺塔 / 占卜 DIY/FBI 树)详解
数据结构·c++·算法
踏浪无痕8 小时前
AI 时代架构师如何有效成长?
人工智能·后端·架构
程序员小假8 小时前
我们来说一下无锁队列 Disruptor 的原理
java·后端
️停云️8 小时前
【滑动窗口与双指针】不定长滑动窗口
c++·算法·leetcode·剪枝·哈希
charlie1145141918 小时前
嵌入式现代C++教程: 构造函数优化:初始化列表 vs 成员赋值
开发语言·c++·笔记·学习·嵌入式·现代c++