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()
相关推荐
范特西.i3 天前
QT聊天项目(8)
开发语言·qt
前网易架构师-高司机3 天前
带标注的驾驶员安全带识别数据集,识别率99.5%,可识别有无系安全带,支持yolo,coco json,pascal voc xml格式
xml·yolo·数据集·交通·安全带
枫叶丹43 天前
【Qt开发】Qt界面优化(七)-> Qt样式表(QSS) 样式属性
c语言·开发语言·c++·qt
逍遥德3 天前
Maven教程.01- settings.xml 文件<profile>使用详解
xml·java·maven
十五年专注C++开发3 天前
Qt deleteLater作用及源码分析
开发语言·c++·qt·qobject
kangzerun3 天前
SQLiteManager:一个优雅的Qt SQLite数据库操作类
数据库·qt·sqlite
金刚狼883 天前
qt和qt creator的下载安装
开发语言·qt
追烽少年x3 天前
Qt中使用Zint库显示二维码
qt
谁刺我心3 天前
qt源码、qt在线安装器镜像下载
开发语言·qt
逍遥德3 天前
Maven教程.03-如何阅读pom.xml文件
xml·java·后端·maven