【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的世界!...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...