【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::Validate0在使用数据之前对其进行验证。这是默认值。
QJsonDocument::BypassValidation1绕过数据验证。只有当您从可信来源收到数据并知道其有效时才使用,因为使用无效数据可能会导致应用程序崩溃。
枚举类型 QJsonDocument::JsonFormat

此值将数据转换为 QJsonDocument 时生成的 JSON 字节数组的格式。

常量描述
QJsonDocument::Indented0定义可读性强的输出,如下所示:
QJsonDocumentCompact1定义紧凑的输出,如下所示:

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++中,可以使用QJsonObjectQVariantMap之间的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,并为其添加了一些键值对。
最后,使用QJsonObjectfromVariantMap()函数将newVariantMap转换回QJsonObject对象newJsonObject,并输出其内容。

通过toVariantMap()fromVariantMap()函数,可以方便地在QJsonObjectQVariantMap之间进行转换,并且可以在转换后访问和操作数据。这些函数是互相转换的,可以根据需要在QJsonObjectQVariantMap之间进行双向转

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 数据之间进行处理和传递。

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

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

相关文章

无论有没有按钮,iPhone都可以进行截屏操作!如何在iPhone上截屏

通过简单的按键组合&#xff0c;可以很容易地将iPhone屏幕的图片捕获到图像文件中&#xff0c;并保存到照片库中。以下是操作方法。 什么是屏幕截图 屏幕截图是指通常包含你在设备屏幕上看到的内容的精确副本的图像。在设备内拍摄的数字屏幕截图通常使用相机拍摄物理屏幕的照…

AD9371 官方例程HDL详解之JESD204B TX_CLK生成 (二)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

HTTPS、SSL/TLS,HTTPS运行过程,RSA加密算法,AES加密算法

1、为什么网站要使用安全证书 我们所处的网络环境是复杂多样的&#xff0c;大致分为两类&#xff0c;一类是可信的网络服务商&#xff0c;比如直接连的电信运营商的网络&#xff0c;网线&#xff0c;4G&#xff0c;5G&#xff1b;另一类是不可信的网络&#xff0c;比如WIFI&am…

Linux笔记之diff工具软件P4merge的使用

Linux笔记之diff工具软件P4merge的使用 code review! 文章目录 Linux笔记之diff工具软件P4merge的使用1.安装和配置2.使用&#xff1a;p4merge a.cc b.cc3.配置git 参考博文: Ubuntu Git可视化比较工具 P4Merge 的安装/配置及使用 1.安装和配置 $ wget https://cdist2.per…

仿CSGO盲盒开箱源码 盲盒商城源码 盲盒开箱源码 潮物盲盒商城源码

仿CSGO盲盒开箱源码 盲盒商城源码 盲盒开箱源码 潮物盲盒商城源码 测试环境&#xff1a;宝塔、Linux、PHP7.2、MySQL5.6 根目录 public&#xff0c;伪静态 thinkphp&#xff0c;php需要Redis扩展 后台&#xff1a;/stf 账号&#xff1a;admin 密码&#xff1a;123123 *后台…

数据结构: map与set的简单实现

目录 map与set的模拟实现 1.基本框架 2.模拟实现map与set所需要做的事 1.使用模板 , 达到泛性编程 2.比较问题 3.迭代器 RBTree中: operator operator-- 4.map [ ] 的实现 5.使用普通迭代器构造const迭代器 效果 map与set的模拟实现 1.基本框架 map set 2.模拟实…

【iOS】MVC模式

MVC&#xff08;Model-View-Controller&#xff0c;模型-视图-控制器&#xff09;模式是相当古老的设计模式之一&#xff0c;ta最早出现在SmallTalk语言中。现在&#xff0c;很多计算机语言和架构都采用了MVC模式。 MVC模式概述 MVC模式是一种设计模式&#xff0c;由3部分组成…

【Spring Cloud】如何确定微服务项目的Spring Boot、Spring Cloud、Spring Cloud Alibaba的版本

文章目录 1. 版本选择2. 用脚手架快速生成微服务的pom.xml3. 创建一个父工程4. 代码地址 本文描述如何确定微服务项目的Spring Boot、Spring Cloud、Spring Cloud Alibaba的版本。 1. 版本选择 我们知道Spring Boot、Spring Cloud、Spring Cloud Alibaba的版本选择一致性非常重…

【ML】cheatsheet

LR 原理与面试题目DT, Adaboost, GBDT, xgboost 原理 细节 与 例子 https://www.cnblogs.com/createMoMo/p/12635709.html xgboost挺详细的算法原理与例子 https://zhuanlan.zhihu.com/p/660468945 着重lightgbm就xgboost的改善方向 https://zhuanlan.zhihu.com/p/366952043机器…

《计算机视觉中的多视图几何》笔记(14)

14 Affine Epipolar Geometry 本章主要是在仿射摄像机的情况下重新考虑对极几何&#xff0c;也就是仿射对极几何。 仿射摄像机的优点是它是线性的&#xff0c;所以很多最优化算法可以用线性代数的知识解决。如果是一般的投影摄像机&#xff0c;很多算法就不是线性的了&#x…

Qt的常用类及作用

Qt是一个跨平台的C应用程序开发框架&#xff0c;提供了丰富的类库和工具&#xff0c;用于创建各种类型的应用程序&#xff0c;包括桌面应用、移动应用、嵌入式应用等。以下是一些Qt中常用的类及其主要作用&#xff1a; 1. QWidget&#xff1a;QWidget是Qt中的基类&#xff0c;…

IDEA 新版本设置菜单展开

使用了新版本的IDEA 新UI后&#xff0c;常用的file&#xff0c;view&#xff0c;菜单看不见了&#xff0c;不太适应&#xff0c;找了一下&#xff0c;有个配置可以修改。 打开settings里面把show main menu in a separate toolbar勾选上&#xff0c;应用保存就可以了

CSS3属性详解(一)文本 盒模型中的 box-ssize 属性 处理兼容性问题:私有前缀 边框 背景属性 渐变 前端开发入门笔记(七)

CSS3是用于为HTML文档添加样式和布局的最新版本的层叠样式表&#xff08;Cascading Style Sheets&#xff09;。下面是一些常用的CSS3属性及其详细解释&#xff1a; border-radius&#xff1a;设置元素的边框圆角的半径。可以使用四个值设置四个不同的圆角半径&#xff0c;也可…

P4 并发控制

文章目录 Task1 锁管理器LockTableUnLockTableLockRowUnLockRow Task2 死锁检测Task3 并发查询执行器Isolation Levelseq_scan_executorinsert_executordelete_executortransaction_manager Task1 锁管理器 LockManager类包含两个属性类&#xff0c;分别是LockRequest和LockRe…

flink中使用GenericWriteAheadSink的优缺点

背景 GenericWriteAheadSink是flink中提供的实现几乎精确一次输出的数据汇抽象类&#xff0c;本文就来看一下使用GenericWriteAheadSink的优缺点 GenericWriteAheadSink的优缺点 先看一下GenericWriteAheadSink的原理图 优点&#xff1a; 几乎可以精确一次的输出&#xf…

漏洞扫描系统的主要功能有哪些

漏洞扫描系统是一种自动化的工具&#xff0c;用于发现和报告计算机网络系统中的安全漏洞。这些漏洞可能包括软件漏洞、配置错误、不安全的网络设备等。漏洞扫描系统的主要功能包括以下几个方面&#xff1a; 目标识别&#xff1a;漏洞扫描系统首先需要识别目标系统的基本信息&am…

在Word中,图片显示不全

在今天交作业的时候&#xff0c;发现了一个非常SB的事情&#xff0c;把图片复制过去显示不完全&#xff1a; 使用文心一言查看搜索了一下&#xff0c;发现可能是以下几种原因&#xff1a; 图片所在行的行高设置不正确。可以重新设置行高&#xff0c;具体步骤包括打开图片显示…

【网络编程】基于epoll的ET模式下的Reactor

需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、Reactor介绍 二、基于epoll的ET模式下的Reactor计算器代码 1、Tcp…

[计算机入门] 应用软件介绍(娱乐类)

3.21 应用软件介绍(娱乐类) 3.21.1 音乐&#xff1a;酷狗 音乐软件是一类可以帮助人们播放、管理和发现音乐的应用程序。它们提供了丰富的音乐内容&#xff0c;用户可以通过搜索、分类浏览或个性化推荐等方式找到自己喜欢的歌曲、专辑或艺术家。音乐软件还通常支持创建和管理…

Python基础入门例程1-NP1 Hello World!

描述 将字符串 Hello World! 存储到变量str中&#xff0c;再使用print语句将其打印出来。 输入描述&#xff1a; 无 输出描述&#xff1a; 一行输出字符串Hello World! 解答&#xff1a; str "Hello World!" print(str) 解释说明&#xff1a; 赋值变量&…