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)
- 创建一个
QDomDocument对象。 - 使用
createElement()和setAttribute()创建根元素和子元素。 - 使用
appendChild()将节点连接成树。 - 使用
toString()转换为QString。 - 使用
QFile将QString写入文件。
读取 (Read)
- 使用
QFile读取 XML 文件内容到QByteArray。 - 调用
QDomDocument::setContent()加载数据。 - 使用
documentElement()获取根元素。 - 使用
firstChildElement()和nextSiblingElement()遍历树结构,使用attribute()读取配置值。
📝 总结:配置文件 I/O 流程
无论是 JSON 还是 XML,完整的配置文件操作都需要结合 Qt Core 的文件 I/O 能力:
- 读取:
QFile::open()->QFile::readAll()->QJsonDocument::fromJson()或QDomDocument::setContent()-> 处理数据。 - 写入: 创建/修改
QJsonObject/QDomDocument->QJsonDocument::toJson()或QDomDocument::toString()->QFile::open()->QFile::write()->QFile::close()。
