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()
相关推荐
stevenson_aspdotnet25 分钟前
QT5.15.12 编译备忘
qt
CSCN新手听安1 小时前
【linux】网络基础(三)TCP服务端网络版本计算器的优化,Json的使用,服务器守护进程化daemon,重谈OSI七层模型
linux·服务器·网络·c++·tcp/ip·json
bloglin999992 小时前
Qwen3-32B报错Invalid json output:{“type“: “1“}For troubleshooting, visit
llm·json
无小道3 小时前
QT——QFIie和QFileInfo文件类
开发语言·qt·命令模式
Trouvaille ~3 小时前
【Linux】应用层协议设计实战(二):Jsoncpp序列化与完整实现
linux·运维·服务器·网络·c++·json·应用层
薛定谔的猫喵喵4 小时前
基于PyQt5的视频答题竞赛系统设计与实现
开发语言·qt·音视频
薛定谔的猫喵喵5 小时前
基于C++ Qt的唐代诗歌查询系统设计与实现
c++·qt·sqlite
枫叶丹45 小时前
【Qt开发】Qt界面优化(一)-> Qt样式表(QSS) 背景介绍
开发语言·前端·qt·系统架构
剩下了什么12 小时前
MySQL JSON_SET() 函数
数据库·mysql·json
明月醉窗台17 小时前
qt使用笔记六之 Qt Creator、Qt Widgets、Qt Quick 详细解析
开发语言·笔记·qt