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

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()获取根元素。 返回文档的根 QJsonObjectQJsonArrayQJsonObject root = doc.object();
fromVariant()静态函数。 从 Qt 通用数据容器 QVariant 转换为 QJsonDocumentN/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()获取键列表。 返回所有键的 QStringListQStringList 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()转换为结构。 将值转换为 QJsonObjectQJsonArrayQJsonObject 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)作用描述
QDomDocumentXML 文档的封装。setContent(const QByteArray &data): 从数据加载整个 XML 文档(用于读取)。
toString(): 将文档转换为 XML 格式的 QString(用于写入)。
createElement(const QString &tagName): 创建一个新的 XML 元素节点。
createTextNode(const QString &text): 创建一个新的文本节点。
QDomElementXML 元素(标签)的封装。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()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值