Qt中解析JSON文件

在Qt中解析JSON字符串主要有两种方式:使用QJsonDocument类或使用QJsonDocument结合QVariant。以下是详细的解析方法:

使用QJsonDocument(推荐)

这种方式的主要相关类如下:

QJsonDocument: QJsonDocument 是 Qt 中处理 JSON 数据的核心类,它提供了在内存中读写 JSON 文档的功能。

主要功能

  1. 解析 JSON:从 UTF-8 编码的文本创建 JSON 文档
  2. 生成 JSON:将内存中的 JSON 数据转换为字符串或二进制格式
  3. 数据访问:提供对 JSON 对象和数组的访问接口
  4. 格式转换:支持紧凑和缩进两种输出格式

QJsonObject:QJsonObject 是 Qt 中用于表示 JSON 对象的类,它存储键值对集合,其中键是字符串,值可以是各种 JSON 类型。

主要特性

  • 键值对存储:存储 QString 作为键,QJsonValue 作为值
  • 无序集合:键的顺序不保证与插入顺序一致
  • 隐式共享:使用写时复制技术,拷贝开销小
  • 类型安全:提供多种类型检查和转换方法

QJsonValue:

QJsonValue 是 Qt 中表示 JSON 值的类,它可以存储 JSON 标准支持的所有数据类型。它是 Qt JSON 系统的核心基础类。

主要特性

  • 多类型存储:可以存储 JSON 支持的所有数据类型
  • 值语义:拷贝和赋值操作是高效的(隐式共享)
  • 类型安全:提供严格的类型检查和转换方法
  • 空值和未定义值:支持 JSON null 和未定义值

支持的数据类型

QJsonValue 可以存储以下类型的值:

类型描述对应的 Qt 类型
NullJSON null 值QJsonValue::Null
Bool布尔值bool
Double双精度浮点数double
String字符串QString
ArrayJSON 数组QJsonArray
ObjectJSON 对象QJsonObject
Undefined未定义值(无效值)QJsonValue::Undefined

QJsonArray:

QJsonArray 是 Qt 中用于表示 JSON 数组的类,它存储有序的 QJsonValue 集合。JSON 数组是值的有序列表,可以包含不同类型的元素。

主要特性

  • 有序集合:元素保持插入顺序
  • 混合类型:可以存储不同类型的值
  • 隐式共享:使用写时复制技术,拷贝开销小
  • 动态大小:支持动态添加和删除元素
  • 索引访问:支持通过索引随机访问元素

下面我们就用进行简单的实战解析。

一、解析简单Json对象

#include <QCoreApplication>
#include<QJsonDocument>
#include<QJsonObject>
#include<QJsonValue>
#include<QJsonArray>void PraseJson()
{QString strJson = R"({"name":"张三","age":30,"isStudent":false})";QJsonDocument doc = QJsonDocument::fromJson(strJson.toUtf8());if(doc.isNull() || !doc.isObject()){qDebug() << "Json解析失败";return;}QJsonObject obj = doc.object();QString strName = obj["name"].toString();int nAge = obj["age"].toInt();bool bStudent = obj["isStudent"].toBool();qDebug() << "名字:" << strName;qDebug() << "年龄:" << nAge;qDebug() << "是否学生:" << bStudent;}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// Set up code that uses the Qt event loop here.// Call a.quit() or a.exit() to quit the application.// A not very useful example would be including// #include <QTimer>// near the top of the file and calling// QTimer::singleShot(5000, &a, &QCoreApplication::quit);// which quits the application after 5 seconds.// If you do not need a running Qt event loop, remove the call// to a.exec() or use the Non-Qt Plain C++ Application template.PraseJson();return a.exec();
}

代码运行结果:

wechat_2025-09-13_104418_550

二、解析嵌套Json对象

void PraseJson2()
{QString strJson = R"({"person":{"name":"李四","address":{"city":"北京","street":"长安街"}},"hobbies":["读书","音乐","运动"]})";QJsonDocument doc = QJsonDocument::fromJson(strJson.toUtf8());if(doc.isNull() || !doc.isObject()){qDebug() << "Json解析失败";return;}QJsonObject rootObj = doc.object();QJsonObject personObj = rootObj["person"].toObject();QJsonObject addressObj = personObj["address"].toObject();QString strName = personObj["name"].toString();qDebug() << "名字:" << strName;QString strCity = addressObj["city"].toString();qDebug() << "城市" << strCity;QString strStreet = addressObj["street"].toString();qDebug() << "街道:" << strStreet;QJsonArray arr = rootObj["hobbies"].toArray();qDebug() << "爱好:";for (const QJsonValue& value: arr){qDebug() << value.toString();}}

代码运行结果:

wechat_2025-09-13_112527_476

三、解析Json数组

void PraseJson3()
{QString strJson = R"([{"name":"王五","age":30},{"name":"赵六","age":35},{"name":"张三","age":20}])";QJsonDocument doc = QJsonDocument::fromJson(strJson.toUtf8());if(doc.isNull()){qDebug() << "Json解析失败";return;}if(doc.isArray()){QJsonArray arr = doc.array();for(const QJsonValue& value:arr){QJsonObject obj = value.toObject();qDebug() << "名字:"<< obj["name"].toString() << ",年龄:" << obj["age"].toInt();}}
}

代码运行结果:

wechat_2025-09-13_115755_115

四、错误处理

void parseJsonWithErrorHandling() {QString jsonString = R"({"invalid": json})"; // 无效的JSONQJsonParseError error;QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8(), &error);if (error.error != QJsonParseError::NoError) {qDebug() << "JSON解析错误:" << error.errorString();return;}if (doc.isNull()) {qDebug() << "文档为空";return;}// 安全地获取值QJsonObject obj = doc.object();QString value = obj.value("key").toString("默认值"); // 如果key不存在,返回默认值// 检查值类型if (obj.contains("key") && obj["key"].isString()) {// 安全处理}
}

五、构建Json对象

void createJson() {QJsonObject person;person["name"] = "张三";person["age"] = 30;QJsonArray hobbies;hobbies.append("读书");hobbies.append("游泳");hobbies.append("编程");person["hobbies"] = hobbies;QJsonObject address;address["city"] = "上海";address["street"] = "南京路";person["address"] = address;QJsonDocument doc(person);QString jsonString = doc.toJson(QJsonDocument::Indented);qDebug() << "生成的JSON:";qDebug() << jsonString;
}

代码运行结果:

wechat_2025-09-13_121120_222

注意事项

  1. 编码问题: 确保JSON字符串使用UTF-8编码
  2. 错误处理: 总是检查解析是否成功
  3. 类型安全: 在访问值之前检查其类型
  4. 内存管理: Qt的JSON类使用隐式共享,无需担心深拷贝性能问题

常用方法

  • QJsonDocument::fromJson() - 从字符串创建文档
  • QJsonObject::value() - 安全获取值(可指定默认值)
  • QJsonValue::toInt(), toString(), toBool() - 类型转换
  • QJsonObject::contains() - 检查键是否存在
  • QJsonValue::isObject(), isArray(), isString() - 检查值类型

: Qt的JSON类使用隐式共享,无需担心深拷贝性能问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/922232.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/922232.shtml
英文地址,请注明出处:http://en.pswp.cn/news/922232.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度解析HTTPS:从加密原理到SSL/TLS的演进之路

在互联网时代,数据安全已成为不可忽视的基石。当我们在浏览器地址栏看到"https://"前缀和那把小小的绿色锁图标时,意味着正在进行一场受保护的通信。但这层保护究竟是如何实现的?HTTPS、SSL和TLS之间又存在着怎样的联系与区别?本文将深入剖析这些技术细节,带你全…

Flutter 官方 LLM 动态 UI 库 flutter_genui 发布,让 App UI 自己生成 UI

今日&#xff0c;Flutter 官方正式发布了它们关于 AI 大模型的 package 项目&#xff1a; genui &#xff0c;它是一个非常有趣和前沿的探索类型的项目&#xff0c;它的目标是帮助开发者构建由生成式 AI 模型驱动的动态、对话式用户界面&#xff1a; 也就是它与传统 App 中“写…

Redis常用数据结构及其底层实现

Redis常用数据结构主要有String List Set Zset Hash BitMap Hyperloglog Stream GeoString:Redis最常用的一种数据结构,Sting类型的数据存储结构有三种int、embstr、raw1.int:用来存储long以下的整形embstr raw 都是用来存字符串&#xff0c;其中小于44字节的字符串用embstr存 …

O3.4 opencv图形拼接+答题卡识别

一图形拼接逻辑导入必要的库pythonimport cv2 import numpy as np import sys导入cv2库用于图像处理&#xff0c;numpy库用于数值计算&#xff0c;sys库用于与 Python 解释器进行交互&#xff0c;例如退出程序。定义图像显示函数def cv_show(name, img):cv2.imshow(name, img)c…

SQL注入常见攻击点与防御详解

SQL注入是一种非常常见且危险的Web安全漏洞。攻击者通过将恶意的SQL代码插入到应用程序的输入参数中&#xff0c;欺骗后端数据库执行这些非预期的命令&#xff0c;从而可能窃取、篡改、删除数据或获得更高的系统权限。以下是详细、准确的SQL注入点分类、说明及举例&#xff1a;…

EKSPod 资源利用率配置修复:从占位符到完整资源分析系统

概述 在 Kubernetes 集群管理过程中,资源利用率的监控和优化是保证应用性能和成本效益的关键环节。近期,我们对 EKSPod 管理界面的资源利用率显示功能进行了全面修复,将原先简单的占位符文本升级为完整的资源分析系统。本文将详细介绍这次修复的背景、方案、实现细节和最终…

Linux内核(架构)

文章目录Linux内核架构概述核心子系统详解1、进程管理2、内存管理3、虚拟文件系统(VFS)4、设备驱动模型掌握Linux内核核心技术阶段1&#xff1a;基础准备阶段2&#xff1a;内核基础阶段3&#xff1a;深入子系统阶段4&#xff1a;高级主题&#xff08;持续学习&#xff09;调试和…

基于数据挖掘的单纯冠心病与冠心病合并糖尿病的证治规律对比研究

标题:基于数据挖掘的单纯冠心病与冠心病合并糖尿病的证治规律对比研究内容:1.摘要 背景&#xff1a;冠心病和冠心病合并糖尿病在临床上较为常见&#xff0c;且二者在证治方面可能存在差异&#xff0c;但目前相关系统研究较少。目的&#xff1a;对比基于数据挖掘的单纯冠心病与冠…

即梦AI快速P图

原图&#xff1a; 模型选择3.0效果比较好&#xff0c;提示词“根据提供图片&#xff0c;要求把两边脸变小&#xff0c;要求把脸变尖&#xff0c;要求眼妆变淡&#xff0c;眼睛更有神&#xff0c;要求提亮面部肤色要求面部均匀&#xff0c;面部要磨皮!鼻头高光和鼻翼两边阴影变淡…

【办公类-109-04】20250913圆牌卡片(接送卡被子卡床卡入园卡_word编辑单面)

背景需求: 为了发被子,我做了全校批量的圆形挂牌,可以绑在“被子包”提手上,便于再操场上发放被子时,很多老师可以协助根据学号发放。 https://blog.csdn.net/reasonsummer/article/details/149755556?spm=1011.2415.3001.5331https://blog.csdn.net/reasonsummer/arti…

Shoptnt 促销计算引擎详解:策略模式与责任链的完美融合

在电商系统中&#xff0c;促销计算是业务逻辑最复杂、变更最频繁的模块之一。它不仅需要处理多种促销类型&#xff08;满减、折扣、优惠券等&#xff09;&#xff0c;还要管理它们之间的优先级和互斥关系。 Shoptnt 设计了一套基于 策略模式 (Strategy Pattern) 和 责任链模式…

【HTTP 请求格式】从请求行 到 请求体

引言 在前后端开发中&#xff0c;前端和后端之间的交互主要依赖于 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;。HTTP 是互联网通信的基础&#xff0c;它定义了客户端&#xff08;通常是浏览器或App&#xff09;和服务器之间如何交换数…

【自记】SQL 中 GROUPING 和 GROUPING SETS 语句的案例说明

我们用一个生活中的例子来理解&#xff0c;比如你开了家小超市&#xff0c;想统计「销售额」&#xff0c;但需要从多个角度看&#xff08;比如按 “日期 商品”、“仅日期”、“仅商品”、“整体总销售额”&#xff09;。假设你的销售数据长这样&#xff08;简化版&#xff09…

C语言第五课:if、else 、if else if else 控制语句

C语言第五课&#xff1a;if、else 、if else if else 控制语句if else 、if else if else 联合使用编程快速学习平台if else 、if else if else 联合使用 代码示列 #include <stdio.h> int main(){//设置中文编码输出到控制台system("chcp 65001");//今天星…

七彩喜智慧养老:用科技温暖晚年,让关爱永不掉线

“当银发潮遇见科技力&#xff0c;养老方式正在发生一场静悄悄的变革。”你有没有想过&#xff1a;当父母年迈独居时&#xff0c;如何确保他们的安全&#xff1f;当老人突然摔倒&#xff0c;如何第一时间获得救助&#xff1f;当慢性病需要长期管理&#xff0c;如何避免频繁奔波…

window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(二)

显示相关的 API 的比较 API用途和目标受众DisplayInformation用于检索 CoreWindow 的呈现和布局属性。HdmiDisplayInformation用于枚举和设置受限模式集的仅限 Xbox 的 API。 高度专用于 Xbox 媒体应用方案。DisplayMonitor用于查询物理监视器设备的属性。 不公开有关操作系统…

Linux 高性能 I/O 事件通知机制的核心系统调用—— `epoll_ctl`

epoll 是 Linux 上处理大量文件描述符 I/O 事件的高效模型&#xff0c;而 epoll_ctl 则是你用来指挥 epoll 实例&#xff08;epoll instance&#xff09;的“遥控器”&#xff0c;负责向它添加、修改或删除需要监视的文件描述符&#xff08;FD&#xff09;及其感兴趣的事件。1.…

mysql 必须在逗号分隔字符串和JSON字段之间二选一,怎么选

如果必须在逗号分隔字符串和JSON字段之间二选一&#xff0c;那么 JSON字段是明显更好的选择。以下是详细的对比分析&#xff1a;对比结论&#xff08;直接看这里&#xff09;方面JSON字段逗号分隔字符串胜出方查询能力✅ 丰富的JSON函数支持❌ 只能使用LIKE模糊查询JSON数据验证…

DPI和DIP的区别

DPI 和 DIP 是两个在计算机图形和移动开发领域常见的术语&#xff0c;它们都与屏幕显示和尺寸有关&#xff0c;但含义和用途不同。 DPI (Dots Per Inch) 定义&#xff1a;DPI 的全称是 Dots Per Inch&#xff0c;即每英寸点数。它是一个衡量物理密度的单位&#xff0c;表示在…

数据帮助我们理解未知世界

主持人 尼古拉安根&#xff1a; 大家好&#xff0c;我是挪威南方财富基金首席执行官尼古拉安根。今天非常荣幸能与大卫斯皮格尔哈尔特爵士对话。坦率地说&#xff0c;他不仅是世界上最优秀的统计学家之一&#xff0c;也是我见过的最佳风险沟通者。他撰写了大量优秀著作&#xf…