【Qt之JSON文件】QJsonDocument、QJsonObject、QJsonArray等类介绍及使用
Qt之JSON相关类介绍
- QJsonDocument
- 常用函数
- 枚举类型 QJsonDocument::DataValidation
- 枚举类型 QJsonDocument::JsonFormat
- 构造函数
- 静态函数
- 成员函数
- 示例
- QJsonObject
- 常用函数
- 构造函数:
- 成员函数:
- QJsonObject 与 QVariantMap 相互转换
- QJsonArray
- 常用函数
- 构造函数:
- 成员函数:
- QJsonArray与QVariantList相互转换
- 将 QJsonArray 转换为 QVariantList:
- 将 QVariantList 转换为 QJsonArray:
QJsonDocument
QJsonDocument类提供了一种读取和写入JSON文档的方式。
QJsonDocument是一个包装完整JSON文档的类,可以从以UTF-8编码的文本表示形式以及Qt自身的二进制格式读取和写入该文档。
可以使用QJsonDocument::fromJson()将基于文本的表示转换为QJsonDocument.toJson()将其转换回文本。解析器非常快速和高效,并将JSON转换为Qt使用的二进制表示形式。
可以使用!isNull()查询已解析文档的有效性。
可以使用isArray()和isObject()查询文档是否包含数组或对象。可以使用array()或object()检索文档中包含的数组或对象,然后进行读取或操作。
还可以使用fromBinaryData()或fromRawData()从存储的二进制表示创建文档。
成员类型文档
常用函数
枚举类型 QJsonDocument::DataValidation
此值用于告诉 QJsonDocument 在使用fromBinaryData()或 fromRawData() 将数据转换为QJsonDocument时是否验证二进制数据。
| 常量 | 值 | 描述 |
|---|---|---|
| QJsonDocument::Validate | 0 | 在使用数据之前对其进行验证。这是默认值。 |
| QJsonDocument::BypassValidation | 1 | 绕过数据验证。只有当您从可信来源收到数据并知道其有效时才使用,因为使用无效数据可能会导致应用程序崩溃。 |
枚举类型 QJsonDocument::JsonFormat
此值将数据转换为 QJsonDocument 时生成的 JSON 字节数组的格式。
| 常量 | 值 | 描述 |
|---|---|---|
| QJsonDocument::Indented | 0 | 定义可读性强的输出,如下所示: |
| QJsonDocumentCompact | 1 | 定义紧凑的输出,如下所示: |
QJsonDocument::Indented格式
{"Array": [true,999,string"],"Key": "Value","null": null}
QJsonDocumentCompact格式
{"Array":[true,999,"string"],"Key":"Value","null":null}
构造函数
QJsonDocument():默认构造函数,创建一个空的JSON文档。QJsonDocument(const QJsonObject& object):使用给定的QJsonObject对象创建一个JSON文档。QJsonDocument(const QJsonArray& array):使用给定的QJsonArray对象创建一个JSON文档。
静态函数
QJsonDocument::fromJson(const QByteArray& json):将指定的JSON表示形式转换为QJsonDocument对象。QJsonDocument::fromVariant(const QVariant& variant):将给定的QVariant对象转换为QJsonDocument对象。QJsonDocument::fromBinaryData(const QByteArray& data, QJsonDocument::DataValidation validation = QJsonDocument::Validate):从二进制数据创建一个QJsonDocument对象,并可选择是否验证数据。QJsonDocument::fromRawData(const char* data, int size, QJsonDocument::DataValidation validation = QJsonDocument::Validate):从原始二进制数据创建一个QJsonDocument对象,并可选择验证数据。
成员函数
- QJsonDocument::toJson(QJsonDocument::JsonFormat format = QJsonDocument::Indented)`:将QJsonDocument对象转换为JSON表示形式的字节数组。
- QJsonDocument::toVariant()`:将QJsonDocument对象转换为QVariant对象。
- QJsonDocument::isEmpty()`:检查JSON文档是否为空。
- QJsonDocument::isNull()`:检查JSON文档是否为null。
QJsonDocument::isArray():检查JSON文档是否为数组。QJsonDocument::isObject():检查JSON文档是否为对象。QJsonDocument::array():获取JSON文档中的数组。QJsonDocument::object():获取JSON文档中的对象。
示例
#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建一个JSON文档QJsonObject object;object["name"] = "John Doe";object["age"] = 25;QJsonArray hobbies;hobbies.append("reading");hobbies.append("music");object["hobbies"] = hobbies;QJsonDocument doc(object);// 将JSON文档转换为字符串表示形式QByteArray jsonBytes = doc.toJson(QJsonDocument::Indented);QString jsonString = QString::fromUtf8(jsonBytes);qDebug() << "JSON Document:" << jsonString;// 解析JSON文档QJsonDocument parsedDoc = QJsonDocument::fromJson(jsonBytes);if(parsedDoc.isNull()){qDebug() << "Failed to parse JSON document.";return 0;}// 检查JSON文档是否为对象if(parsedDoc.isObject()){QJsonObject parsedObject = parsedDoc.object();qDebug() << "Parsed JSON Object:";qDebug() << "Name:" << parsedObject["name"].toString();qDebug() << "Age:" << parsedObject["age"].toInt();qDebug() << "Hobbies:";QJsonArray parsedHobbies = parsedObject["hobbies"].toArray();for(const auto& hobby : parsedHobbies){qDebug() << " -" << hobby.toString();}} else {qDebug() << "Parsed JSON document is not an object.";return 1;}return a.exec();
}
在示例中,创建了一个JSON文档,其中含了一个包含姓名年龄和兴趣爱好的对象。
然后,将该对象转换为JSON字符串表示形式,并输出到控制台。
接下来,使用QJsonDocument::fromJson()函数解析该JSON字符串,将其转换为QJsonDocument对象。
最后,检查解析的JSON文档是否为对象,并打印出对象中的值。
示例展示了使用QJsonDocument类创建和解析JSON文档。可以根据需求修改和扩展代码。请注意,示例中使用了Qt应用程序和处理事件循环。如果在不使用Qt框架的环境中使用QJsonDocument,需要相应地修改代码。
QJsonObject
QJsonObject 类封装了一个JSON对象。JSON 对象是一个键值对列表,其中键是唯一的字符串,值由QJsonValue表示。QJsonObject 可以与 QVariantMap 相互转换。您可以使用size()查询(键,值)对的数量,使用insert()和remove()从中插入和删除条目,并使用标准的 C++ 迭代器模式遍历其内容。QJsonObject 是一个隐式共享类,只要不进行修改,它就会与创建它的文档共享数据。您可以通过QJsonDocument将对象从基于文本的 JSON 转换出来和转换进去。
常用函数
构造函数:
QJsonObject():默认构造函数,创建一个空的JSON对象。QJsonObject(const QJsonObject &other):拷贝构造函数,根据另一个JSON对象创建一个新的JSON对象。
成员函数:
bool isEmpty() const:判断JSON对象是否为空,如果对象中不包含任何属性,则返回true,否则返回false。int size() const:返回JSON对象中属性的数量。bool contains(const QString &key) const:检查JSON对象中是否包含指定键。void insert(const QString &key, const QJsonValue &value):向JSON对象中插入一个键值对。void remove(const QString &key):从JSON对象中移除指定键的属性。QJsonValue value(const QString &key) const:返回指定键对应的值。如果键不存在,则返回QJsonValue()。QStringList keys() const:返回JSON对象中所有键的列表。QJsonObject &operator=(const Q &other):赋值运算符,将另一个JSON对象属性复制到当前对象中。QJsonValue operator[](const QString &key) const:通过键访问JSON对象的属性值。
通过这些构造函数和成员函数,可以创建JSON对象、添加、移除和访问对象的属性值,并操作以及获取对象的相关信息。这些函数提供了便捷的方式来处理和操作JSON对象。
QJsonObject 与 QVariantMap 相互转换
在C++中,可以使用QJsonObject和QVariantMap之间的fromVariant()和toVariant()两个函数来实现相互转换。下面是一个示例:
#include <QCoreApplication>
#include <QJsonObject>
#include <QVariantMap>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建一个QJsonObjectQJsonObject jsonObject;jsonObject["name"] = "John Doe";jsonObject["age"] = 25;jsonObject["isEmployed"] = true;// 将QJsonObject转换为QVariantMapQVariantMap variantMap = jsonObject.toVariantMap();// 输出转换后的QVariantMap内容qDebug() << "QVariantMap:";qDebug() << "Name:" << variantMap["name"].toString();qDebug() << "Age:" << variantMap["age"].toInt();qDebug() << "Is Employed:" << variantMap["isEmployed"].toBool();// 创建一个QVariantMapQVariantMap newVariantMap;newVariantMap["name"] = "Jane Smith";newVariantMap["age"] = 30;newVariantMap["isEmployed"] = false;// 将QVariantMap转换为QJsonObjectQJsonObject newJsonObject = QJsonObject::fromVariantMap(newVariantMap);// 输出转换后的QJsonObject内容qDebug() << "QJsonObject:";qDebug() << "Name:" << newJsonObject["name"].toString();qDebug() << "Age:" << newJsonObject["age"].toInt();qDebug() << "Is Employed:" << newJsonObject["isEmployed"].toBool();return a.exec();
}
在上述示例中,创建了一个QJsonObject对象jsonObject,并为其添加了一些键值对。
然后,使用toVariantMap()函数将其转换为QVariantMap对象variantMap,并输出其内容。
接下来,创建了一个新的QVariantMap对象newVariantMap,并为其添加了一些键值对。
最后,使用QJsonObject的fromVariantMap()函数将newVariantMap转换回QJsonObject对象newJsonObject,并输出其内容。
通过toVariantMap()和fromVariantMap()函数,可以方便地在QJsonObject和QVariantMap之间进行转换,并且可以在转换后访问和操作数据。这些函数是互相转换的,可以根据需要在QJsonObject和QVariantMap之间进行双向转
QJsonArray
QJsonArray类封装了一个JSON数组。
QJsonArray可以与QVariantList相互转换。可以使用size()、insert()和removeAt()来查询数组中的条目数量,并使用标准的C++迭代器模式遍历其内容。
QJsonArray是一个隐式共享的类,并且只要它没有被修改,就与其创建的文档共享数据。
可以通过QJsonDocument将数组转换为基于文本的JSON,也可以将文本转换为数组。
常用函数
QJsonArray是Qt框架中的一个类,用于表示JSON数组。它提供了一组构造函数和一些常用的成员函数,用于创建、操作和访问JSON数组的元素。下面是QJsonArray的构造函数和一些常用成员函数介绍:
构造函数:
QJsonArray():默认构造函数,创建一个空的JSON数组QJsonArray(const QJsonArray &other):拷贝构造函数,根据另一个JSON数组创建一个新的JSON数组。QJsonArray(std::initializer_list<QJsonValue> list):使用初始化列表创建一个新的JSON数组。
成员函数:
bool isEmpty() const:判断JSON数组是否为空,如果数组中不包含任何元素,则返回true,否则返回``。int size() const:返回JSON数组中元素的数量。void append(const QJsonValue &value):向JSON数组末尾添加一个元素。void prepend(const QJsonValue &value):在JSON数组开头插入一个元素。void insert(int index, const QJsonValue &value):在指定位置插入一个元素。void removeAt(int index):移除指定位置的元素。QJsonValue at(int index) const:返回指定位置的元素。QJsonValue operator[](int index) const:通过索引访问JSON数组的元素。void replace(int index, const QJsonValue &value):替换指定位置的元素。QVariantList toVariantList() const:将JSON数组转换为QVariantList。QString toJson(QDocument::JsonFormat format = QJsonDocument::Indented) const:将JSON数组转换为文本形式的JSON。
通过这些构造函数和成员函数,可以创建JSON数组、添加、移除和访数组的元素,并操作以及获取数组的相关信息。
QJsonArray与QVariantList相互转换
以下是将 QJsonArray 转换为 QVariantList 和将 QVariantList 转换为 QJsonArray 相互转换示例。
将 QJsonArray 转换为 QVariantList:
QJsonArray jsonArray;
jsonArray.append(10);
jsonArray.append("Hello");
jsonArray.append(false);QVariantList variantList = jsonArray.toVariantList();
在示例中,创建一个 QJsonArray 对象 jsonArray,然后向其中添加一些元素。使用 jsonArray 的 toVariantList() 函数将其转换为 QVariantList 对象 variantList。
将 QVariantList 转换为 QJsonArray:
QVariantList variantList;
variantList << 10 << "Hello" << false;QJsonArray jsonArray = QJsonArray::fromVariantList(variantList);
在示例中,创建一个 QVariantList 对象 variantList,并向其中添加一些元素。然后,使用 QJsonArray 的静态函数 fromVariantList() 将 variantList 转换为 QJsonArray 对象 jsonArray。
通过这些示例,可以在 QJsonArray 和 QVariantList 之间进行双向转换,方便地在 JSON 数据和 QVariant 数据之间进行处理和传递。
相关文章:
【Qt之JSON文件】QJsonDocument、QJsonObject、QJsonArray等类介绍及使用
Qt之JSON相关类介绍 QJsonDocument常用函数枚举类型 QJsonDocument::DataValidation枚举类型 QJsonDocument::JsonFormat构造函数静态函数成员函数示例 QJsonObject常用函数构造函数:成员函数: QJsonObject 与 QVariantMap 相互转换 QJsonArray常用函数构…...
阿里云今年有双十一活动吗?不好说
阿里云今年有双十一活动吗?不好说,因为去年就没有。阿里云双11优惠活动是一项大型的促销活动,每年都有,但是去年没有双十一活动,不知道今年2023年阿里云是否有双11优惠活动。但是阿里云百科aliyunbaike.com猜想&#x…...
【驱动开发】创建设备节点、ioctl函数的使用
一、控制三盏灯的亮灭 头文件: #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; #define PHY_LED1_ADDR 0X50006000 #def…...
Tomcat启动控制台乱码问题
修改Tomcat/conf/logging.properties...
学习周总结
http://t.csdnimg.cn/DKki2 http://t.csdnimg.cn/NvudJ 项目进度 做了大概的主界面,然后做了一个客户端和服务端的分离,实现了在客户端发送的信息,在服务端能收到;客户端和服务端的制作是我之前有写的一个http://t.csdnimg.cn/…...
如何在不恢复出厂设置的情况下解锁 Android 手机密码?
当您忘记 Android 手机的密码时,可能会有压力,尤其是当您不想恢复出厂设置并删除所有数据时。但是,有一些方法可以在不诉诸如此激烈的步骤的情况下解锁手机。我们将在这篇文章中教您如何在不恢复出厂设置的情况下解锁 Android 手机密码。我们…...
移动设备管理对企业IT 安全的增强
移动设备管理 (MDM) 是通过定义策略和部署安全控制(如移动应用程序管理、移动内容管理和条件 Exchange 访问)来管理移动设备的过程。 完整的MDM解决方案可以管理在Android,iOS,Windows,macOS&a…...
app分发的一些流程
应用分发的流程通常包括以下步骤: 开发应用程序:首先,您需要开发您的应用程序。这包括编写代码、设计用户界面、测试应用程序等等。确保您的应用程序符合各个应用商店的规范和要求,以确保顺利通过审核。 准备应用材料:…...
深入浅出讲解Spring IOC和DI的区别
Spring IOC和DI的区别 一,介绍 前言 很多人都会把ioc和di说成同一个东西,其实IOC和DI虽然在概念上可以笼统地视为同一事物,但其本质上存在区别。IOC(Inverse of Control,控制反转)从容器的角度描述&#…...
文件操作 IO
文件(File) 狭义的文件: 指的是硬盘上的文件和目录 广义的文件: 泛指计算机中很多软硬件资源(操作系统中把很多硬件和软件资源抽象成了文件, 按照文件的方式同意管理) 本章内容只讨论狭义的文件 路径 绝对路径: 以c: , d: 盘符开头的路径相对路径: 以当前所在的目录为基准(…...
ARouter - 组件化通信方案
官网 https://github.com/alibaba/ARouter/blob/master/README_CN.md 项目简介 一个用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦 功能介绍 支持直接解析标准URL进行跳转,并自动注入参数到目标页面中支持多模块工程使用支持添…...
Linux中常见的权限问题
目录 前言1. 目录权限2. umask3. 粘滞位结语 前言 在了解完上一篇文章 Linux权限的理解与操作 之后,还有一些比较常见的权限问题需要我们去了解。其中包括目录的权限,umask 以及 粘滞位的使用。 1. 目录权限 问题一:进入一个目录࿰…...
【技术分享】RK356X Ubuntu 推流USB摄像头
本文适用与触觉智能所有RK356X ubuntu系统的主板。 IDO-SBC3566基于瑞芯微RK3566研发的一款高性能低功耗的智能主板,采用四核A55,主频高达1.8GHz,专为个人移动互联网设备和AIOT设备而设计,内置了多种功能强大的嵌入式硬件引擎,为…...
介绍一下rabbitMq应用场景
任务队列:RabbitMQ可以将待处理的任务放入队列中,再由多个工作进程异步地执行这些任务。 日志处理:RabbitMQ可以通过发布-订阅模式将日志消息分发到多个消费者,并可以灵活地控制消息的优先级和过滤条件。 实时消息处理ÿ…...
IoT 物联网共享充电桩场景中设备资产定位和地理围栏开发实践
基于经纬度的设备资产定位和地理围栏在物联网场景中应用广泛 01 物联网 GEO 场景架构方案 首先,IoT 终端设备通过卫星定位模块获取当前经纬度;然后,将坐标信息实时上报到物联网平台;最后,存储到 Redis GEO 数据库中。 …...
【Qt进阶之自定义控件】使用QListWidget实现自定义Item效果
目的 Q:如何在Qt库的基础上,实现自定义控件呢? A:根据官方文档回答,就是继承需实现的控件,然后实现自定义功能。 以下是实现QListWidget控件的自定义item。 先看下最终效果是如何: listItem 主…...
【iOS】UITableView总结(Cell的复用原理、自定义Cell、UITableViewCell协议方法)
UITableView 列表的特点: 数据量大样式较为统一通常需要分组垂直滚动通常可视区只有一个 -> 视图的复用 UITableViewDataSource UITableView作为视图,只负责展示,协助管理,不管理数据 需要开发者为UITableView提供展示所需…...
shell之常见网络命令介绍
shell之常见网络命令介绍 1)ifconfig 用于配置网络接口。可以用于开启、关闭和设置网络接口的参数,如IP地址、子网掩码、MAC地址等。 ifconfig eth0 192.168.1.1 netmask 255.255.255.0 up上述命令将设置eth0网络接口的IP地址为192.168.1.1,子…...
Android屏幕刷新机制
基础知识 CPU运行在Android设备上的中央处理器(Central Processing Unit)是Android设备的核心组件之一,负责执行计算和控制设备的各种操作。 Android设备上的CPU通常采用ARM架构,如ARM Cortex-A系列处理器。这些处理器具有高性能…...
Python学习第3天-第一个Python程序
文章目录 前言一、创建项目二、创建程序总结 前言 下面给大家展示下经典的Hello World! 一、创建项目 二、创建程序 print("Hello World!")总结 回到顶部 学习网站 欢迎来到Python的世界!...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
