7.2Qt中Json的操作

发布时间:2026/10/8 4:14:00

7.2Qt中Json的操作 在Json的两种格式中介绍了Json的格式以及应用场景。由于这种数据格式与语言无关下面介绍一下Json在Qt中的使用。从Qt 5.0开始提供了对Json的支持我们可以直接使用Qt提供的Json类进行数据的组织和解析。相关的类常用的主要有四个具体如下1. QJsonValue在Qt中QJsonValue可以封装的基础数据类型有六种和Json支持的类型一致分别为布尔类型QJsonValue::Bool浮点类型包括整形 QJsonValue::Double字符串类型 QJsonValue::StringJson数组类型 QJsonValue::ArrayJson对象类型QJsonValue::Object空值类型 QJsonValue::Null这个类型可以通过QJsonValue的构造函数被封装为一个类对象:// Json对象 QJsonValue(const QJsonObject o); // Json数组 QJsonValue(const QJsonArray a); // 字符串 QJsonValue(const char *s); QJsonValue(QLatin1String s); QJsonValue(const QString s); // 整形 and 浮点型 QJsonValue(qint64 v); QJsonValue(int v); QJsonValue(double v); // 布尔类型 QJsonValue(bool b); // 空值类型 QJsonValue(QJsonValue::Type type Null);如果我们得到一个QJsonValue对象如何判断内部封装的到底是什么类型的数据呢这时候就需要调用相关的判断函数了具体如下// 是否是Json数组 bool isArray() const; // 是否是Json对象 bool isObject() const; // 是否是布尔类型 bool isBool() const; // 是否是浮点类型(整形也是通过该函数判断) bool isDouble() const; // 是否是空值类型 bool isNull() const; // 是否是字符串类型 bool isString() const; // 是否是未定义类型(无法识别的类型) bool isUndefined() const;通过判断函数得到对象内部数据的实际类型之后如果有需求就可以再次将其转换为对应的基础数据类型对应的API函数如下// 转换为Json数组 QJsonArray toArray(const QJsonArray defaultValue) const; QJsonArray toArray() const; // 转换为布尔类型 bool toBool(bool defaultValue false) const; // 转换为浮点类型 double toDouble(double defaultValue 0) const; // 转换为整形 int toInt(int defaultValue 0) const; // 转换为Json对象 QJsonObject toObject(const QJsonObject defaultValue) const; QJsonObject toObject() const; // 转换为字符串类型 QString toString() const; QString toString(const QString defaultValue) const;2. QJsonObjectQJsonObject封装了Json中的对象在里边可以存储多个键值对为了方便操作键值为字符串类型值为QJsonValue类型。关于这个类的使用类似于C中的STL类仔细阅读API文档即可熟练上手使用下面介绍一些常用API函数:如何创建空的Json对象QJsonObject::QJsonObject(); // 构造空对象将键值对添加到空对象中iterator QJsonObject::insert(const QString key, const QJsonValue value);获取对象中键值对个数int QJsonObject::count() const; int QJsonObject::size() const; int QJsonObject::length() const;通过key得到valueQJsonValue QJsonObject::value(const QString key) const; // utf8 QJsonValue QJsonObject::value(QLatin1String key) const; // 字符串不支持中文 QJsonValue QJsonObject::operator[](const QString key) const; QJsonValue QJsonObject::operator[](QLatin1String key) const;删除键值对void QJsonObject::remove(const QString key); QJsonValue QJsonObject::take(const QString key); // 返回key对应的value值通过key进行查找iterator QJsonObject::find(const QString key); bool QJsonObject::contains(const QString key) const;遍历方式有三种使用相关的迭代器函数使用 [] 的方式遍历, 类似于遍历数组, []中是键值先得到对象中所有的键值, 在遍历键值列表, 通过key得到value值QStringList QJsonObject::keys() const;3. QJsonArrayQJsonArray封装了Json中的数组在里边可以存储多个元素为了方便操作所有的元素类统一为QJsonValue类型。关于这个类的使用类似于C中的STL类仔细阅读API文档即可熟练上手使用下面介绍一些常用API函数:创建空的Json数组QJsonArray::QJsonArray();添加数据void QJsonArray::append(const QJsonValue value); // 在尾部追加 void QJsonArray::insert(int i, const QJsonValue value); // 插入到 i 的位置之前 iterator QJsonArray::insert(iterator before, const QJsonValue value); void QJsonArray::prepend(const QJsonValue value); // 添加到数组头部 void QJsonArray::push_back(const QJsonValue value); // 添加到尾部 void QJsonArray::push_front(const QJsonValue value); // 添加到头部计算数组元素的个数int QJsonArray::count() const; int QJsonArray::size() const;从数组中取出某一个元素的值QJsonValue QJsonArray::at(int i) const; QJsonValue QJsonArray::first() const; // 头部元素 QJsonValue QJsonArray::last() const; // 尾部元素 QJsonValueRef QJsonArray::operator[](int i);删除数组中的某一个元素iterator QJsonArray::erase(iterator it); // 基于迭代器删除 void QJsonArray::pop_back(); // 删除尾部 void QJsonArray::pop_front(); // 删除头部 void QJsonArray::removeAt(int i); // 删除i位置的元素 void QJsonArray::removeFirst(); // 删除头部 void QJsonArray::removeLast(); // 删除尾部 QJsonValue QJsonArray::takeAt(int i); // 删除i位置的原始, 并返回删除的元素的值Josn数组的遍历常用的方式有两种可以使用迭代器进行遍历和使用迭代器遍历STL容器一样可以使用数组的方式遍历4. QJsonDocument它封装了一个完整的JSON文档并且可以从UTF-8编码的基于文本的表示以及Qt自己的二进制格式读取和写入该文档。QJsonObject 和 QJsonArray这两个对象中的数据是不能直接转换为字符串类型的如果要进行数据传输或者数据的持久化操作的都是字符串类型而不是 QJsonObject 或者 QJsonArray类型我们需要通过一个Json文档类进行二者之间的转换。下面依次介绍一下这两个转换流程应该如何操作:QJsonObject 或者 QJsonArray 字符串1.创建QJsonDocument对象QJsonDocument::QJsonDocument(const QJsonObject object); QJsonDocument::QJsonDocument(const QJsonArray array);可以看出通过构造函数就可以将实例化之后的**QJsonObject 或者 QJsonArray **转换为QJsonDocument对象了。2.将文件对象中的数据进行序列化// 二进制格式的json字符串 QByteArray QJsonDocument::toBinaryData() const; // 文本格式 QByteArray QJsonDocument::toJson(JsonFormat format Indented) const;通过调用toxxx()方法就可以得到文本格式或者二进制格式的Json字符串了。3.使用得到的字符串进行数据传输, 或者磁盘文件持久化字符串 QJsonObject 或者 QJsonArray一般情况下通过网络通信或者读磁盘文件就会得到一个Json格式的字符串如果想要得到相关的原始数据就需要对字符串中的数据进行解析具体解析流程如下1.将得到的Json格式字符串通过 QJsonDocument 类的静态函数转换为QJsonDocument类对象[static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray data, DataValidation validation Validate); // 参数文件格式的json字符串 [static] QJsonDocument QJsonDocument::fromJson(const QByteArray json, QJsonParseError *error Q_NULLPTR);2.将文档对象转换为json数组/对象// 判断文档对象中存储的数据是不是数组 bool QJsonDocument::isArray() const; // 判断文档对象中存储的数据是不是json对象 bool QJsonDocument::isObject() const // 文档对象中的数据转换为json对象 QJsonObject QJsonDocument::object() const; // 文档对象中的数据转换为json数组 QJsonArray QJsonDocument::array() const;3.通过调用QJsonArray , QJsonObject 类提供的 API 读出存储在对象中的数据。关于Qt中Json数据对象以及字符串之间的转换的操作流程是固定的我们在编码过程中只需要按照上述模板处理即可相关的操作是没有太多的技术含量可言的。5. 举例5.1 写文件void writeJson() { QJsonObject obj; obj.insert(Name, Ace); obj.insert(Sex, man); obj.insert(Age, 20); QJsonObject subObj; subObj.insert(Father, Gol·D·Roger); subObj.insert(Mother, Portgas·D·Rouge); QJsonArray array; array.append(Sabo); array.append(Monkey D. Luffy); subObj.insert(Brother, array); obj.insert(Family, subObj); obj.insert(IsAlive, false); obj.insert(Comment, yyds); QJsonDocument doc(obj); QByteArray json doc.toJson(); QFile file(d:\\ace.json); file.open(QFile::WriteOnly); file.write(json); file.close(); }5.2 读文件void MainWindow::readJson() { QFile file(d:\\ace.json); file.open(QFile::ReadOnly); QByteArray json file.readAll(); file.close(); QJsonDocument doc QJsonDocument::fromJson(json); if(doc.isObject()) { QJsonObject obj doc.object(); QStringList keys obj.keys(); for(int i0; ikeys.size(); i) { QString key keys.at(i); QJsonValue value obj.value(key); if(value.isBool()) { qDebug() key : value.toBool(); } if(value.isString()) { qDebug() key : value.toString(); } if(value.isDouble()) { qDebug() key : value.toInt(); } if(value.isObject()) { qDebug() key :; // 直接处理内部键值对, 不再进行类型判断的演示 QJsonObject subObj value.toObject(); QStringList ls subObj.keys(); for(int i0; ils.size(); i) { QJsonValue subVal subObj.value(ls.at(i)); if(subVal.isString()) { qDebug() ls.at(i) : subVal.toString(); } if(subVal.isArray()) { QJsonArray array subVal.toArray(); qDebug() ls.at(i) :; for(int j0; jarray.size(); j) { // 因为知道数组内部全部为字符串, 不再对元素类型进行判断 qDebug() array[j].toString(); } } } } } } }一般情况下对于Json字符串的解析函数都是有针对性的因为需求不同设计的Json格式就会有所不同所以不要试图写出一个通用的Json解析函数这样只会使函数变得臃肿而且不易于维护每个Json格式对应一个相应的解析函数即可。上面的例子中为了给大家演示Qt中Json类相关API函数的使用将解析步骤写的复杂了因为在解析的时候我们是知道Json对象中的所有key值的可以直接通过key值将对应的value值取出来因此上面程序中的一些判断和循环其实是可以省去的。
延伸阅读

更多相关文章

2026/10/4 16:24:34

Umi-OCR 离线文字识别完整指南:免费开源OCR软件的6步上手指南

Umi-OCR 离线文字识别完整指南:免费开源OCR软件的6步上手指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置…

2026/10/6 20:25:02

从零构建桌面伪系统:前端实战教程与核心代码解析

最近在技术社区看到不少关于“伪系统”的讨论,很多开发者,尤其是刚入门的朋友,对如何从零开始构建一个具备基础交互逻辑的“系统”很感兴趣。这其实是一个绝佳的练手项目,它能帮你串联起编程基础、事件处理、UI逻辑和状态管理等核…

2026/10/8 4:12:37

pytest核心实战:从fixture到参数化与插件体系

写测试的人大概都听过这种论调:"代码写得好不好,看测试写得怎么样。"虽然有点绝对,但至少说明测试在现代软件工程里的地位。我自己刚接触 pytest 的时候,纯属被 mock 写烦了,想在 unittest 之外找点更顺手的…

2026/10/8 4:12:37

考研复试出题逻辑与备考策略:四邮之一招生600+的高分上岸指南

1. 复试到底在卷什么:先搞懂这场考试的出题逻辑能点进这篇文章的,说明你已经摸到了考研这场长跑的最后一段。标题里的“四邮之一”“招生600”这两个信息放在一起,本身就是一道信号题:体量这么大的招生名额,意味着报考…

2026/10/8 4:12:37

Linux下iNode 7.3 x64安装与802.1X认证配置指南

简介:这份针对64位Linux系统的H3C网络管理软件包,适用于需要统一监控路由器、交换机等设备的中大型网络运维场景。它借助Linux iNode机制存储文件权限、时间戳等元数据,为设备配置管理、性能监控与故障排查提供高效支撑,要求使用者…

2026/10/8 4:12:37

Reddit多维语境数据集:重构社区动态建模基础

1. 这不是又一个“爬帖子”的工具包:Reddit数据集背后的真实战场你有没有试过把一段 Reddit 的热门讨论丢给大模型,结果它只盯着每个单词的字面意思,完全没get到那个“发帖人其实在自嘲”、“楼中楼第三层那个‘呵呵’是阴阳怪气”、“整个帖…

2026/10/8 4:12:37

YOLOv11 GFLOPs显示为0?一文搞懂FLOPs计算原理与修复方法

做YOLOv11训练的时候,每次弹出来的模型摘要看着总觉得不得劲。明明Parameters有十几兆参数,结果下面那行GFLOPs要么是个0.000,要么干脆整行消失,旁边圈里人互相问了一圈,得到的答案不是“版本问题”就是“没初始化”。…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/7 8:18:33

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 0:02:17

自然数立方等于连续奇数之和:从证明到编程验证

十几年来我一直游走在数学科普和编程教学这两块内容之间,对“看起来像魔法、拆开全是数学”的结论总是格外敏感。最近翻资料时又撞见一句话:任何一个自然数 m 的立方,都可以写成 m 个连续奇数之和。2 的立方等于 3 加 5,3 的立方等…

2026/10/8 0:02:17

C#上位机SSH连接实战:用SSH.NET补齐超时、批量与密钥认证

简介:这是一份基于 C# 开发的 SSH 连接功能半成品工程,原本作为另一个主项目的子功能模块,现独立打包分享。工程采用 WinForms 界面,包含源码、解决方案、安装部署工程、NuGet 依赖包及说明文档,适合正在做远程连接、网…

2026/10/8 0:02:17

Java SpringBoot一体化智能售后系统设计与实现全解析

毕业设计年年做,Java Web 方向的题目翻来覆去就那么几个,但“一体化智能售后系统”这个题,每次看到我都觉得值得认真聊一聊。它不是一个简单 curd 堆出来的管理系统,而是把客户、工单、派单、处理、回访、统计整条链路串起来的一套…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑