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() 获取根元素。 返回文档的根 QJsonObjectQJsonArray 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() 转换为结构。 将值转换为 QJsonObjectQJsonArray 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. 使用 QFileQString 写入文件。
读取 (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()
相关推荐
Bug制造者_Guo2 小时前
QML BorderImage的使用
qt
x***01064 小时前
使用 MySQL 从 JSON 字符串提取数据
mysql·oracle·json
枫叶丹44 小时前
【Qt开发】Qt窗口(二) -> QToolBar工具栏
开发语言·数据库·c++·qt
a***97684 小时前
使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法
xml·spring·logback
rainFFrain16 小时前
qt显示类控件---QProgressBar
开发语言·qt
rainFFrain16 小时前
qt输入类控件---QComboBox/QSpinBox
开发语言·qt
咸甜适中17 小时前
rust语言,将JSON中的所有值以字符串形式存储到sqlite数据库中(逐行注释)
数据库·rust·sqlite·json
Ustinian_31017 小时前
【HTML】前端工具箱实现【文本处理/JSON工具/加解密/校验和/ASCII/时间戳转换等】【附完整源代码】
前端·html·json
牵牛老人17 小时前
QML 复杂交互控件开发:自定义控件的状态管理、动画性能及内存泄漏规避
qt