Qt 对 JSON和XML文件的操作详解


🌟 I. JSON 文件操作 (QJson - Part of Qt Core)

Qt 对 JSON 数据的支持集中在 Qt Core 模块的几个类中。JSON 因其轻量级和易于阅读的特性,常被用作现代应用程序的配置文件格式。

1. QJsonDocument:JSON 文档的封装

这是整个 JSON 文档的入口点,用于读写文件。

核心函数 (Function) 作用描述 示例用法
fromJson(const QByteArray &json) 静态函数。 从 UTF-8 编码的字节数组中解析 JSON 文档,返回一个 QJsonDocument 对象。 QJsonDocument::fromJson(data);
toJson(JsonFormat format = Compact) 序列化。 将文档内容转换为 QByteArray(UTF-8 编码)。Compact(紧凑)或 Indented(格式化)。 doc.toJson(QJsonDocument::Indented);
isObject() / isArray() 检查类型。 检查文档的根是否为 JSON 对象或 JSON 数组。 if (doc.isObject()) { ... }
object() / array() 获取根元素。 返回文档的根 QJsonObject 或 QJsonArray。 QJsonObject root = doc.object();
fromVariant() 静态函数。 从 Qt 通用数据容器 QVariant 转换为 QJsonDocument。 N/A

2. QJsonObject:JSON 对象的封装

表示 JSON 中的 {} 结构(键值对的集合)。

核心函数 (Function) 作用描述 示例用法
insert(const QString &key, const QJsonValue &value) 插入/修改键值对。 插入或更新一个键对应的值。 obj.insert("Name", "Alice");
value(const QString &key) 获取值。 通过键获取对应的 QJsonValue 对象。 QJsonValue val = obj.value("Age");
contains(const QString &key) 检查键是否存在。 if (obj.contains("ID")) { ... }
remove(const QString &key) 删除键值对。 obj.remove("TempKey");
keys() 获取键列表。 返回所有键的 QStringList。 QStringList keys = obj.keys();

3. QJsonArray:JSON 数组的封装

表示 JSON 中的 [] 结构(值的有序集合)。

核心函数 (Function) 作用描述 示例用法
append(const QJsonValue &value) 添加元素。 在数组末尾添加一个值。 array.append(10);
insert(int index, const QJsonValue &value) 插入元素。 在指定索引处插入一个值。 array.insert(0, "Start");
at(int index) 访问元素。 获取指定索引处的 QJsonValue 对象。 QJsonValue val = array.at(i);
size() 获取大小。 返回数组中元素的数量。 for (int i = 0; i < array.size(); ++i)

4. QJsonValue:JSON 值的通用封装

表示 JSON 中的任何基本类型(字符串、数字、布尔、Null)或结构(对象、数组)。

核心函数 (Function) 作用描述 示例用法
isString() / isBool() / isDouble() 判断类型。 检查封装的值的类型。 if (val.isString()) { ... }
toString() / toInt() / toBool() 转换为 C++ 类型。 将 JSON 值转换为对应的 C++ 基本数据类型。 QString s = val.toString();
toObject() / toArray() 转换为结构。 将值转换为 QJsonObject 或 QJsonArray。 QJsonObject subObj = val.toObject();

⚙️ II. XML 文件操作 (Qt Xml 模块)

XML 通常用于较复杂的配置结构或需要大量属性的场景。Qt Xml 模块提供了两种主要的解析方式:DOM (Document Object Model) 和 SAX (Simple API for XML)。

在配置文件的读写中,DOM 方式因其能快速构建和修改整个树结构而更常用。

1. DOM 方式:QDomDocument

DOM 方式将整个 XML 文件加载到内存中,表示为一个节点树。

核心类 (Class) 核心函数 (Function) 作用描述
QDomDocument XML 文档的封装。 setContent(const QByteArray &data) : 从数据加载整个 XML 文档(用于读取)。 toString() : 将文档转换为 XML 格式的 QString(用于写入)。 createElement(const QString &tagName) : 创建一个新的 XML 元素节点。 createTextNode(const QString &text): 创建一个新的文本节点。
QDomElement XML 元素(标签)的封装。 setAttribute(const QString &name, const QString &value) : 设置元素的属性值。 attribute(const QString &name) : 获取元素的属性值。 tagName() : 获取元素的标签名称。 firstChildElement(const QString &tagName = QString()) : 获取第一个子元素(可选按名称)。 nextSiblingElement(): 获取同级下一个元素。
QDomNode 所有 XML 节点(元素、属性、文本等)的基类。 appendChild(const QDomNode &newChild) : 添加一个子节点。 toElement() : 转换为 QDomElement(安全)。

XML 配置文件的基本读写流程

写入 (Write)
  1. 创建一个 QDomDocument 对象。
  2. 使用 createElement() 和 setAttribute() 创建根元素和子元素。
  3. 使用 appendChild() 将节点连接成树。
  4. 使用 toString() 转换为 QString。
  5. 使用 QFile 将 QString 写入文件。
读取 (Read)
  1. 使用 QFile 读取 XML 文件内容到 QByteArray。
  2. 调用 QDomDocument::setContent() 加载数据。
  3. 使用 documentElement() 获取根元素。
  4. 使用 firstChildElement() 和 nextSiblingElement() 遍历树结构,使用 attribute() 读取配置值。

📝 总结:配置文件 I/O 流程

无论是 JSON 还是 XML,完整的配置文件操作都需要结合 Qt Core 的文件 I/O 能力:

  1. 读取: QFile::open() -> QFile::readAll() -> QJsonDocument::fromJson() 或 QDomDocument::setContent() -> 处理数据。
  2. 写入: 创建/修改 QJsonObject / QDomDocument -> QJsonDocument::toJson() 或 QDomDocument::toString() -> QFile::open() -> QFile::write() -> QFile::close()。
相关推荐
镜子AI6 小时前
镜子AI工程实践:用 Python 做 GEO 实体一致性审计,并自动生成 JSON-LD 结构化数据
人工智能·python·json
syagain_zsx10 小时前
jsoncpp 使用指南:编译链接、Json::Value 取值与高频坑
c++·json·库·http格式
数据狐(Datafox)15 小时前
一文读懂京东商品详情 API:返回字段解读与 JSON 样例
开发语言·数据库·爬虫·json
布莱克60516 小时前
QtWidgets 与 QML:两大 UI 开发框架的全面对比
开发语言·c++·qt·ui·架构
qq_4017004118 小时前
Qt 实时大数据量存储:自己动手实现 TDMS 读写
数据库·qt
NiceBlueChai18 小时前
Qt 跨线程传递多容器嵌套结构:一次 Release 实测
开发语言·qt
扶尔魔ocy18 小时前
【QT android】模仿行车记录仪案例
android·qt
福兮说1 天前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
zhanghaha13141 天前
Qt 类本质就是 C++ 的类,只是 Qt 框架扩展了一套【QObject 对象模型】
qt
烂蜻蜓1 天前
Pandas入门教程(六):数据读写详解——CSV、JSON、Pickle 与格式选型
json·pandas