QT中的JSON

1.JSON的两种数据格式

JSON有两种数据格式:JSON对象和JSON数组

JSON数组:

JSON数组格式:[元素1,元素2,元素3,......元素n]

JSON数组中的元素可以是同一类型,也可以使不同类型,可以嵌套JSON数组或JSON对象

JSON对象:

JSON对象格式:{“key1:” : value1, “key2” : value2 , “key3” : value3 }

JSON对象内部使用键值对的方式来组织,键是字符串类型,值可以为多种类型,也可以为JSON数组或JSON对象

​​​​​​​1.2 JSON在线解析

JSON本质就是一种特殊格式的字符串

收到的json字符串是压缩格式,没有换行和缩进,不便于判断格式是否正确

可以通过JSON在线解析工具来校验JSON的格式是否正确

在json.cn进行查看

2.Qt中JSON的使用

Qt中提供JSON类,便于生成和解析JSON字符串

相关JSON类:

QJsonObject

QJsonArray

QJsonValue

QJsonDocument

​​​​​​​2.1 QJsonObject

QJsonObject封装了JSON中的对象,可以存储多个键值对,键为字符串类型,值为QJsonValue类型

常用方法

方法

说明

QJsonObject()

创建一个空的QJsonObject对象

bool contains(const QString&key) const

查对象中是否包含给定的键

int count() const

返回对象中包含的键值对数量,与size()函数功能相同

bool empty() const

检查对象是否为空

QJsonObject::iterator find(const QString&key)

返回一个迭代器,指向具有指定键的键值对。如果未找到,则返回end()

QJsonObject::iterator erase(QJsonObject::iterator it)

从对象中删除迭代器所指向的键值对,并返回指向下一个键值对的迭代器

JsonObject::iterator insert(const QString&key,const QJsonValue&value)

向对象中添加一个新的键值对

QJsonObject::iterator begin()

返回一个迭代器,指向对象中的第一个键值对

QJsonObject::iterator end()

返回一个迭代器,指向对象中的“尾后”位置

QJsonObject::const_iterator find(const QString&key) const

返回一个常量迭代器,指向具有指定键的键值对

例:

​​​​​​​2.2QJsonArray

QJsonArray封装了JSON中的数组,数组中元素的类型统一为QJsonValue类型

常用方法

方法

说明

append(const QJsonValue &value)

在数组末尾添加一个QJsonValue

at(int i) const

返回数组中索引为i的QJsonValue

contains(const QJsonValue &value) const

检查数组是否包含特定的QJsonValue

size() const

返回数组中的元素数量

removeAt(int i)

删除数组中索引为i的元素

takeAt(int i)

取出并删除数组中索引为i的元素

insert(int i, const QJsonValue& value)

将元素插入到指定索引处

​​​​​​​2.3QJsonValue

QJsonValue封装了JSON支持的六种数据类型:

Bool  ,Double,  String,  QJSonArray,  QJSonObject,  Null

获取到QJsonValue对象后,可以通过判断函数来确定其封装的类型

方法

bool isString() const;

bool isDouble() const;

bool isBool() const;

bool isObject() const;          ---QJsonObject    

bool isArray() const;           ---QJsonArray

bool isUndefined() const;      ---是否为未识别的类

bool isNull() ocnst;

获取到QJsonValue封装的类型后,可以通过函数进行转换

方法

QString toString() const;

QString toString(const QString &defaultValue) const;

double todouble(double defaultValue=0) const;

int toInt(int defaultValue=0) const;

bool toBool(bool defaultValue=false) const;

QJsonObject toObject(const QJsonObject &defaultValue) const;

QJsonObject toObject() const;

QJsonArray toArray(const QJsonArray &defaultValue) cosnt;

QJsonArray toArray() const;

​​​​​​​2.4QJsonDocument

QJsonDocument封装了一个完整的JSON文档

可以从UTF-8编码基于文本的表示,以及Qt本身的二进制格式读取和写入该文档

QJsonObject和QJsonArray这两种对象是不能直接转换为字符串类型的,需要通过QJsonDocument类来完成二者的转换

构建json字符串方法:

将得到的QJsonObject/QJsonArray转换成字符串

//1.以QJsonObject/QJsonArray为参数创建QJsonDocument对象

QJsonDocument ::QJsonDocument(const QJsonObject &object);

QJsonDocument ::QJsonDocument(const QJsonArray &array);

//2.对QJsonDocument对象中的数据进行序列化,转化成json字符串

QByteArray QJsonDocument::toBinaryData() const;  ---二进制格式

QByteArray QJsonDocument::toJson(JsonFormat format=Indented) const;   ---文本格式

解析json字符串方法

将得到的JSON格式的字符串转化成其封装的对应类型的数据

//1,将JSON字符串---二进制格式或字符串格式转换成QJsonDocument对象

QJsonDocument::formBinaryData(const QByteArray &data,DataValidation validation=Validate);

QJsonDocument::formJson(const QByteArray &json,QJsonParseError *error=Q_NULLPTR);

//2.将QJsonDocument对象转换成json数组/对象

//先判断为json数组还是json对象

bool QJsonDocument::isArray() const;

bool QJsonDocument::isObject() const;

//再转化

QJsonObject QJsonDocument::object() const;

QJsonArray QJsonDocument::array() const;

//3.再通过QJsonArray/QJsonObject的相关方法判断其存储类型,将数据转换为对应类型

例如:

构建JSON字符串---用于向服务端发送消息

创建一个基类为QWidget的文件,在头文件类中声明构建json字符串的函数

在widget构造函数中调用writeJson

转到定义

运行后输出json字符串

格式化输出:

toUtf8()
        将 QString 转换为 QByteArray(UTF-8 编码的字节流),此时字符串中的换行符(\n)和缩进(空格)会被保留。

data()
        返回 QByteArray 的 const char* 指针,qDebug() 会将其视为普通 C 字符串处理,直接按原始内容输出,包括换行和缩进。

将JSON字符串写入文件

解析JSON字符串---用于接收收到的json字符串

在widget.h的类中声明解析json字符串的函数

在widget构造函数中调用

实现readJson函数

​​​​​​​

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

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

相关文章

详细剖析传输层协议(TCP和UDP)

详细讲解传输层的网络协议,为什么TCP是可靠连接协议,凭什么能做到不丢包,有哪些机制保证可靠呢? TCP/UDP UDPTCP**三次握手和四次挥手****滑动窗口****拥塞控制**(socket套接字)**listen的第二个参数** UD…

数据可视化:艺术与科学的交汇点,如何让数据“开口说话”?

数据可视化:艺术与科学的交汇点,如何让数据“开口说话”? 数据可视化,是科技与艺术的结合,是让冰冷的数字变得生动有趣的桥梁。它既是科学——讲究准确性、逻辑性、数据处理的严谨性;又是艺术——强调美感…

解决使用lettuce连接Redis超时的问题(tcpUserTimeout 参数失效问题)

问题背景 lettuce 连接Redis的主从实例,当主节的主机异常下电重启后,由于没有发送RST 包,导致 lettuce 一直在复用之前的TCP链接,然后会出现连接超时的情况。一直出现io.lettuce.core.RedisCommandTimeoutException: Command tim…

如何使用python保存字典

在Python中,可以通过多种方式将字典(dict)保存到文件中,并能够随时读取恢复。以下是几种常见的方法: 1. 使用 json 模块(推荐) 适用场景:需要人类可读的文件格式,且数据不…

SQL 与 Python:日期维度表创建的不同选择

文章目录 一、日期维度表概述日期维度表结构 二、使用 SQL 创建日期维度表2.1 表结构设计2.2 数据插入2.3 SQL 创建方式的优势与局限 三、使用 Python 创建日期维度表3.1 依赖库引入3.2 代码实现3.3 Python 创建方式的优势与局限 四、应用场景与选择建议4.1 应用场景4.2 选择建…

如何用postman进行批量操作

业务场景: 有些时候,我们会需要批量的将SAP B1系统中的几千条的数据删除或者取消单据,这个时候,一条条去操作,指定是到猴年马月了。SAP Business One本身提供了DTW这个工具,但是这个更新,可以操…

Mysql如何完成数据的增删改查(详解从0到1)

前言: Mysql可能是每个程序员的必修课,可以说是使用起来是没有什么问题的,但是作为一名合格的程序猿,深入学习Mysql的内部工作原理是非常有必要的,主要是理解和学习Mysql的底层思想,希望在日后如遇到一些&…

单片机嵌入式按键库

kw_btn库说明 本库主要满足嵌入式按键需求,集成了常用的按键响应事件:高电平、低电平、上升沿、下降沿、单击、双击、长按键事件。可以裸机运行,也可以配合实时操作系统运行。 本库开源连接地址:连接 实现思路 本库采用C语言进行…

Qt—鼠标移动事件的趣味小程序:会移动的按钮

1.项目目标 本次根据Qt的鼠标移动事件实现一个趣味小程序:当鼠标移动到按钮时,按钮就会随机出现在置,以至于根本点击不到按钮。​​​​​ 2.项目步骤 首先现在ui界面设计控件(也可以用代码的方式创建,就不多说了) 第一个按钮不需…

MySQL的information_schema在SQL注入中的关键作用与防御策略

目录 一、information_schema的核心价值 二、攻击利用场景与示例 1. 联合查询注入(Union-Based) 2. 报错注入(Error-Based) 3. 布尔盲注(Boolean Blind) 4. 时间盲注(Time-Based&#xff0…

c语言 关键字--目录

下面是详细介绍的链接 1.c语言 关键字 2.typedef 关键字 3.volatile 关键字 4.register 关键字 5.const关键字用法 6.extern关键字 7.sizeof关键字

python爬虫爬取网站图片出现403解决方法【仅供学习使用】

基于CSDN第一篇文章,Python爬虫之入门保姆级教程,学不会我去你家刷厕所。 这篇文章是2021年作者发表的,由于此教程,网站添加了反爬机制,有作者通过添加cookie信息来达到原来的效果,Python爬虫添加Cookies以…

docker创建一个centOS容器安装软件(以宝塔为例)的详细步骤

备忘:后续偶尔忘记了docker虚拟机与宿主机的端口映射关系,来这里查看即可: docker run -d \ --name baota \ --privilegedtrue \ -p 8888:8888 \ -p 8880:80 \ -p 8443:443 \ -p 8820:20 \ -p 8821:21 \ -v /home/www:/www/wwwroot \ centos…

linux 使用nginx部署ssl证书,将http升级为https

前言 本文基于:操作系统 CentOS Stream 8 使用工具:Xshell 8、Xftp 8 服务器基础环境: nginx - 请查看 linux 使用nginx部署vue、react项目 所需服务器基础环境,请根据提示进行下载、安装。 1.下载证书 以腾讯云为例&#x…

日常开发中,iOS 性能调优我们怎么做?

日常开发中,iOS 性能调优我们怎么做?聊聊我用过的几款工具 最近在给一个 iOS 视频类 App 做性能优化,过程中踩了不少坑,也用了一些不错的工具,今天就以一个开发者视角随便聊聊我在调试过程中的一些经验。 一、性能问…

Redis ⑨-Jedis | Spring Redis

Jedis 通过 Jedis 可以连接 Redis 服务器。 通过 Maven 引入 Jedis 依赖。 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><versi…

【人工智能】解锁AI潜能:LM Studio多模型并行运行DeepSeek与开源大模型的实践指南

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的快速发展,LM Studio作为一款本地化部署工具,以其简单易用的图形化界面和强大的模型管理能力受到广泛关注。本文深…

Node.js面试题

一、什么是Node.js&#xff1f; Node.js 是一个开源的跨平台 JavaScript 运行时环境&#xff0c;允许开发者在服务器端运行 JavaScript 代码。它基于 Chrome 的 V8 JavaScript 引擎构建&#xff0c;能够高效地处理 I/O 操作&#xff0c;适合构建高性能的网络应用。 异步非阻塞&…

Playwright MCP 入门实战:自动化测试与 Copilot 集成指南

什么是 MCP&#xff1f; MCP&#xff08;Model Context Protocol&#xff09; 是一种为大语言模型&#xff08;LLM&#xff09;设计的协议&#xff0c;MCP充当 LLM 与实际应用之间的桥梁或“翻译器”&#xff0c;将自然语言转化为结构化指令&#xff0c;使得模型可以更精确、高…

达梦DM数据库安装步骤

文章目录 1、下载并解压缩2、安装DM数据库2.1 运行安装程序2.2 选择语言与时区2.3 安装向导2.4 许可证协议2.5 Key文件2.6 选择组件2.7 安装位置2.8 安装前小结2.9 安装过程2.10 已完成2.11 初始化 3、配置实例3.1选择操作方式3.2创建数据库模版3.3指定数据库目录3.4数据库标识…