【Qt】Json在Qt中的使用

Json

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于互联网应用程序之间的数据传输。JSON基于JavaScript中的对象语法,但它是独立于语言的,因此在许多编程语言中都有对JSON的解析和生成支持。

Json包括Json对象和Json数组,两者都可以嵌套。

Json数组:

[
    ["a", 123, "c", false],
    ["周一", "周二", "周三", "周四"],
]

以下是一个JSON对象的例子:

{
    "name": "Alice",
    "age": 25,
    "isStudent": true,
    "hobbies": ["hiking", "reading"],
    "address": {
        "city": "New York",
        "zipCode": "10001"
    }
}

在上述例子中,name、age、isStudent等属性以键值对的形式存在,地址字段中又包含了另一个嵌套的JSON对象。

Qt中的Json类

包括:

  • QJsonValue:封装了Json支持的数据类型
  • QJsonObject:Qt中的Json对象
  • QJsonArray:Qt中的Json数组
  • QJsonDocument:实现Json数组/Json对象与字符串之间的转换

一张图带你理清Qt中Json类的关系:

在这里插入图片描述

QJsonValue

在 Qt 中,QJsonValue 是用于表示 JSON 数据的类,它可以包含 JSON 中的各种数据类型,包括对象、数组、字符串、数值、布尔值和 null 值。

  1. 多种数据类型支持: QJsonValue 可以存储 JSON 中的各种数据类型。它可以表示对象(QJsonObject)、数组(QJsonArray)、字符串(QString)、数值(double)、布尔值(bool)和 null 值(QJsonValue::Null)。

可以查询Qt Assistant了解QJsonValue的用法:
构造函数:
在这里插入图片描述

示例:

QJsonValue value1 = 123; // 数值类型
QJsonValue value2 = "Hello"; // 字符串类型
QJsonValue value3 = true; // 布尔类型
QJsonValue value4 = QJsonValue::Null; // null 类型
  1. 判断JSON 数据类型: 可以使用 QJsonValue 的方法来获取其存储的数据类型和值。
    使用 QJsonValue::isObject()QJsonValue::isArray()QJsonValue::isString() 等方法判断存储的是何种数据类型。

在这里插入图片描述

  1. 方便的转换和操作: QJsonValue 提供了用于转换和操作 JSON 数据的方法,如 toObject()toArray()toVariant()toBool() 等,这些方法能够方便地将 JSON 数据转换为其他数据结构进行进一步处理。

在这里插入图片描述
示例:

QJsonValue value = ...; // 一个 QJsonValue 对象
if (value.isString()) {
    QString stringValue = value.toString();
    // 处理字符串类型
} else if (value.isObject()) {
    QJsonObject objValue = value.toObject();
    // 处理对象类型
}
// 其他类型的处理...

QJsonObject

QJsonObject封装了Json中的对象,在里边可以存储多个键值对,为了方便操作,键值为字符串类型,值为QJsonValue类型

注意:QjsonObject内部按照key值升序排列(红黑树),所以添加顺序和实际顺序不一致。

  1. 创建 JSON 对象并插入:
    可以使用 QJsonObject::insert() 方法向对象中插入键值对,也可以直接使用赋值语句初始化 QJsonObject 对象。

在这里插入图片描述

QJsonObject jsonObj;
jsonObj.insert("name", "Alice");
jsonObj.insert("age", 25);
  1. 访问和操作 JSON 对象内容: 可以使用 QJsonObject 提供的方法来访问和操作对象中的键值对。比如使用 value() 方法获取特定键的值,使用 contains() 方法检查特定键是否存在,使用 remove() 方法删除特定键值对等。
    a. 通过key获得value
    在这里插入图片描述

    b. 通过下标获得value
    在这里插入图片描述
    c. 检查键是否存在
    在这里插入图片描述
    d. remove删除键值对,take删除键值对并返回删除的值
    在这里插入图片描述
    在这里插入图片描述

示例:

QJsonObject jsonObj;
jsonObj.insert("name", "Alice");
jsonObj.insert("age", 25);

// 访问键值对
QString name = jsonObj.value("name").toString();
int age = jsonObj.value("age").toInt();

// 检查键是否存在
bool hasName = jsonObj.contains("name");

// 删除键值对
jsonObj.remove("age");
  1. 遍历
    a. 使用下标[]遍历
    b. 使用QJsonObject::keys()得到键值,再遍历键值。

示例:

// 创建一个例子的 JSON 对象
    QJsonObject jsonObj;
    jsonObj.insert("name", "Alice");
    jsonObj.insert("age", 25);
    jsonObj.insert("city", "New York");

    // 使用 QJsonObject::keys() 获取键值
    QStringList keys = jsonObj.keys();

    // 遍历键,并访问对应的值
    foreach(QString key, keys) {
        QJsonValue value = jsonObj.value(key); // 获取键对应的值
        if(value.isString()) {
            qDebug() << "Key:" << key << ", Value:" << value.toString(); // 输出键值对
        }
        else {
            qDebug() << "Key:" << key << ", Value is not a string";
        }
    }

QJsonArray

QJsonArray是Qt中的Json数组,与QJsonObject不同,QJsonArray的插入顺序与实际存储顺序相同。

以下是 QJsonArray 主要的特性和用法:

  1. 创建 JSON 数组: 可以使用 QJsonArray 的构造函数或 append() 方法向数组中添加元素,也可以直接使用赋值语句初始化 QJsonArray 对象。
QJsonArray jsonArray;
jsonArray.append("Apple");
jsonArray.append("Banana");
jsonArray.append("Orange");
  1. 访问和操作 JSON 数组内容: 可以使用 QJsonArray 提供的方法来访问和操作数组中的元素。比如使用 at() 方法或 [] 操作符获取特定位置的元素,使用 size() 方法获取数组的大小等。
QJsonArray jsonArray;
jsonArray.append("Apple");
jsonArray.append("Banana");
jsonArray.append("Orange");

// 遍历数组
for (int i = 0; i < jsonArray.size(); ++i) {
    qDebug() << jsonArray.at(i).toString(); // 输出数组元素
}
  1. 删除
    在 Qt 的 QJsonArray 类中,可以使用以下方法来删除数组中的元素:

    1. removeAt(int index): 该方法用于删除指定索引位置上的元素。

    2. removeFirst()removeLast(): 这两个方法分别用于删除数组中的第一个元素和最后一个元素。

    3. removeAll(const QJsonValue &value): 该方法用于删除数组中所有与指定值相等的元素。

QJsonDocument

QJsonDocument 是 Qt 中用于表示和操作 JSON 文档的类,它提供了一种方便的方式来解析、创建和处理 JSON 数据。QJsonDocument 可以用于将 JSON 数据表示为树形结构,并提供了方法用于序列化和反序列化 JSON 数据,以及在应用程序中方便地访问和操作 JSON 数据。

以下是 QJsonDocument 主要的特性和用法:

  1. 解析 JSON 数据: 使用 QJsonDocument 类可以将来自字符串、文件或其他来源的 JSON 数据解析为一个 JSON 文档,便于应用程序进一步操作。
QByteArray jsonData = "{\"name\":\"Alice\", \"age\":25}";
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);

// 如果数据解析成功
if (!jsonDoc.isNull()) {
    QJsonObject jsonObj = jsonDoc.object();
    qDebug() << "Name:" << jsonObj.value("name").toString();
    qDebug() << "Age:" << jsonObj.value("age").toInt();
}
  1. 序列化 JSON 数据: 可以使用 toJson() 方法将 QJsonDocument 转换为 JSON 格式的字节数组,方便用于存储或网络传输。
QJsonObject jsonObj;
jsonObj.insert("name", "Alice");
jsonObj.insert("age", 25);
QJsonDocument jsonDoc(jsonObj);

QByteArray jsonData = jsonDoc.toJson();
qDebug() << jsonData;
  1. 访问和操作 JSON 文档内容: 可以通过 QJsonDocument 提供的方法,如 object()、isArray() 和 isNull(),来获取文档中的 JSON 对象或数组,以及检查文档是否为空。
QJsonDocument jsonDoc = QJsonDocument::fromJson(someData);
if (!jsonDoc.isNull()) {
    if (jsonDoc.isObject()) {
        QJsonObject jsonObj = jsonDoc.object();
        // 处理 JSON 对象
    } else if (jsonDoc.isArray()) {
        QJsonArray jsonArray = jsonDoc.array();
        // 处理 JSON 数组
    }
}

QJsonDocument 类提供了一种方便的方式来解析、操作和序列化 JSON 数据,使得在 Qt 应用程序中处理 JSON 数据变得更加简单和灵活。通过使用 QJsonDocument,您可以方便地在应用程序中加载、保存和处理各种格式的 JSON 数据。

示例

{
    "name": "Alice",
    "age": 25,
    "isStudent": true,
    "hobbies": ["hiking", "reading"],
    "address": {
        "city": "New York",
        "zipCode": "10001"
    }
}

头文件:

#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>

将上述json对象写入文件:

 QJsonObject jsonObject;
 jsonObject.insert("name", "Alice");
 jsonObject.insert("age", 25);
 jsonObject.insert("isStudent", true);

 QJsonArray hobbiesArray;
 hobbiesArray.append("hiking");
 hobbiesArray.append("reading");
 jsonObject.insert("hobbies", hobbiesArray);

 QJsonObject addressObject;
 addressObject.insert("city", "New York");
 addressObject.insert(zipCode", "10001");
 jsonObject.insert("address", addressObject);

 QJsonDocument doc(jsonObject);

 QFile file("D:\\data.json");
 if(file.open(QFile::WriteOnly)){
 	QByteArray json = doc.toJson();
	file.write(json);
 	file.close();
 	 qDebug() << "JSON object has been written to" << fileName;
 } else {
     qDebug() << "Failed to open file for writing";
 }

从文件读取:

 QFile file("D:\\data.json");
 if (file.open(QFile::ReadOnly)) {
    QByteArray jsonData = file.readAll();//全部读取
    file.close();
    QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);

	if(jsonDoc.isObject())
	{
	    QJsonObject obj = jsonDoc.object();
	    QStringList keys = obj.keys();
	    for(int i=0; i<keys.size(); ++i)
	    {
	        QString key = keys.at(i);
	        QJsonValue value = obj.value(key);
	        if(value.isBool())
	        {
	            qDebug() << key << ":" << value.toBool();
	        }
	        if(value.isString())
	        {
	            qDebug() << key << ":" << value.toString();
	        }
	        if(value.isDouble())
	        {
	            qDebug() << key << ":" << value.toInt();
	        }
	        if(value.isObject())
	        {
	            qDebug()<< key << ":";
	            QJsonObject subObj = value.toObject();
	            QStringList ls = subObj.keys();
	            for(int j=0; j<ls.size(); ++j)
	            {
	                QJsonValue subVal = subObj.value(ls.at(j));
	                qDebug() << "   " << ls.at(j) << ":" << subVal.toString();
	            }
	        }
	        if(value.isArray())
            {
                QJsonArray array = value.toArray();
                qDebug() << key << ":" ;
                for(int j=0; j<array.size(); ++j)
                {
                    qDebug() << "       " << array[j].toString();
                }
            }
	    }
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 音视频流媒体浅谈

C流媒体开发 今天就浅浅聊一下C流媒体开发 流媒体开发中最常见的是FFmpeg&#xff08;编解码器&#xff09; 业务逻辑主要是播放器了&#xff08;如腾旭视频 爱奇艺等等&#xff09; FFmpeg是一个开源的音视频处理工具集&#xff0c;可以用于处理、转换和流媒体传输音视频…

python-自动化篇-办公-文件-加解密

解说 要使⽤Python进⾏⽂件的加密和解密&#xff0c;可以使⽤第三⽅加密库&#xff0c;如cryptography或pycryptodome。 ⼀个基本的⽰例&#xff0c;演⽰如何使⽤cryptography库对⽂件进⾏加密和解密&#xff1a; 安装cryptography库&#xff1a; pip install cryptography⽂…

运行程序时出现“无效类”的解决方法

最近做开发时&#xff0c;遇到了一个奇怪的问题&#xff0c;打开的烧录软件突然出现了“无效类”的字样&#xff0c;以前打开却时正常的&#xff0c;真的是莫名其妙。 然后找了很久的解决办法&#xff0c;终于在某一天运行一个系统软件出现了同样的问题&#xff0c;有提示到WMI…

Kore.ai获10亿元融资,提供定制化类ChatGPT助手

1月31日&#xff0c;生成式AI和企业对话平台Kore.ai在官网宣布&#xff0c;获得1.5 亿美元&#xff08;约10.7亿元&#xff09;融资。本次由FTV Capital 领投&#xff0c;英伟达等跟投。 Kore.ai主要提供银行、医疗、零售、营销、人力资源等多种领域的&#xff0c;定制化类Cha…

【Qt学习笔记】(二)信号和槽

信号和槽 1 信号和槽概述2 信号和槽的使用3 可视化生成槽函数4 自定义信号和槽5 带参数的信号和槽6 信号与槽的连接方式7 信号与槽的断开8 使用 Lambda 表达式来定义槽函数 1 信号和槽概述 在Qt中&#xff0c;用户和控件的每次交互过程称为一个事件。比如"用户点击按钮&q…

在Android Studio中配置OpenCV

在Android Studio中配置OpenCV 1 下载OpenCV2 导入OpenCV模块3 修改配置4 增加依赖5 拷贝libopencv_java.so6 Activity中加入代码1 下载OpenCV 下载OpenCV的Android包并解压。 2 导入OpenCV模块 在Android应用中,导入OpenCV模块。 导入目录时选择Opencv Android中的sdk目…

杠杆交易在伦敦金市场的优势与风险

伦敦金作为黄金市场的灯塔&#xff0c;每天吸引着全球投资者的目光。伦敦金的特殊地位使得以它为基准的杠杆交易成为众多投资者追逐的目标。在这篇文章中&#xff0c;我们将深入探讨伦敦金杠杆交易的奥秘&#xff0c;带你揭开这一盛宴的神秘面纱。 伦敦金杠杆交易的核心在于通过…

bs4模块

bs4模块与案例 使用指南 bs4&#xff0c;全称BeautifulSoup 4&#xff0c;是Python中一个强大的网页解析库&#xff0c;它可以帮助我们方便地从网页中提取数据。bs4将复杂HTML文档转换成树形结构&#xff0c;每个节点都是Python对象&#xff0c;所有对象可以归纳为4种&#xf…

vue动态修改侧边菜单栏宽度

1.添加可修改宽度的dom元素 <div style"background: #f5f7fa;padding: 20px 10px;"><label>菜单宽度 </label><el-input v-model"sideWidth" placeholder"请输入宽度值" style"width: 100px"/> px<el-but…

PMP认证是如何评估项目管理能力的?

当提及项目管理能力时&#xff0c;PMP认证是广泛接受的评估标准。作为项目管理领域的权威认证&#xff0c;PMP评估了申请人在项目管理方面的专业能力和实践经验。那么&#xff0c;PMP认证如何评估项目管理能力呢&#xff1f;本文将揭示PMP认证的评估体系和流程。 PMP认证的评估…

Notion 开源替代品:兼容 Miro 绘图 | 开源日报 No.162

toeverything/AFFiNE Stars: 25.6k License: NOASSERTION AFFiNE 是下一代知识库&#xff0c;将规划、排序和创建集于一身。它是一个注重隐私、开源、可定制且即插即用的替代方案&#xff0c;可以与 Notion 和 Miro 相媲美。主要功能和优势包括&#xff1a; 超融合&#xff1…

Android系统-应用程序中的View框架

源码分析基于Android 7 应用程序中的View框架如图所示 1. View和ViewRoot 单单从名称看很容易让人产生误解&#xff0c;因为ViewRoot并不属于View树的一分子。源码上ViewRoot和View对象也没有继承关系。更准确说ViewRoot理解为View输的管理者&#xff0c;ViewRoot有一个mView成…

apk反编译修改教程系列---修改apk的默认颜色 布局颜色 手机电脑同步演示【十】

往期教程&#xff1a; apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 apk反编译修改教程系列---简单…

【Tomcat与网络11】如何自己实现一个简单的HTTP服务器

在前面我们尝试解释Tomcat的理论&#xff0c;但是呢&#xff0c;很多时候那些复杂的架构和设计会让我们眼花缭乱&#xff0c;以至于忽略了最进本的问题——服务器到底是什么&#xff1f;今天我们就用尽量简单的代码实现一个简易的HTTP服务器。 HTTP启动之后要持续监听&#xf…

ele-h5项目使用vue3+vite开发:第二节、search 搜索框组件开发

如何设计一个组件 需求分析 布局 content left-iconbodyinput-controlright-iconaction 功能 使用 defineEmits 定义组件的事件 在组件的script setup 里如何定义事件 使用defineEmits&#xff08;&#xff09;定义先声明事件接口 <script setup lang"ts"> int…

某赛通电子文档安全管理系统 UploadFileToCatalog SQL注入漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

睿尔曼超轻量仿人机械臂——外置按钮一键启停程序配置

在睿尔曼超轻量仿人机械臂—外置按钮盒使用说明一文中&#xff0c;介绍了外置按钮盒的安装及使用。它能够使机械臂的使用变得更加编辑&#xff0c;仅需按钮即可完成运动程序的启停等控制&#xff0c;而无需进入示教界面操作。 在示教界面中&#xff0c;我们可以完成运动程序的…

UserWarning: Glyph 39640 missing from current font问题

是因为不支持中文字体导致的&#xff0c;设置为一个支持中文的字体就行了。 另外&#xff0c;上面的改动会引起负号显示为方块&#xff0c;需要额外再加一条设置。 在中文系统上 import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 设置为一个支持…

xlsx xlsx-style坑记录

1 安装 npm install xlsx --savenpm install xlsx-style --save Umi运行会报错 自己代码 import XLSX from "xlsx"; import XLSXStyle from "xlsx-style";const data [["demo1","demo2","demo3","demo4","…

计算机设计大赛 深度学习 python opencv 火焰检测识别 火灾检测

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…