【Qt】Json在Qt中的使用

news2024/10/6 23:39:38

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.coloradmin.cn/o/1426282.html

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

相关文章

[opencvsharp]C#基于Fast算法实现角点检测

角点检测算法有很多&#xff0c;比如Harris角点检测、Shi-Tomas算法、sift算法、SURF算法、ORB算法、BRIEF算法、Fast算法等&#xff0c;今天我们使用C#的opencvsharp库实现Fast角点检测 【算法介绍】 fast算法 Fast(全称Features from accelerated segment test)是一种用于角…

集合问题(并查集)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例1&#xff1a; 输入 4 5 9 2 3 4 5 输出 YES 0 0 1 1 样例2&#xff1a; 输入 3 3 4 1 2 4 输出 NO 思路&#xff1a; 这道题关键点在于。 当集合中有一个元素均存在于集合 A 和集合 B 的时…

(杂项笔记)腾讯文档设置隔行换色

文档小技巧 一、在表格工具栏中选择“数据”栏二、选择新建条件格式三、进行以下设置1. 应用范围2. 条件设置3. 这是表格颜色 四、样例展示1. 隔行换色2. 隔3行换色 最近在使用某家的文档进行多人协同办公&#xff0c;遇到的一些小技巧&#xff0c;在这里分享给大家&#xff1b…

无广告iOS获取设备UDID 简单方便快捷

ps&#xff1a; 为啥不用蒲公英了&#xff0c;就是因为有广告了&#xff0c;获取个UDID还安装游戏&#xff0c;真恶心?&#xff0c;所以找了新的获取UDID都方法&#xff0c;网页直接获取就可以&#xff0c;不会安装软件。 UDID 是一种 iOS 设备的特殊识别码。除序号之外&…

Java多线程--解决单例模式中的懒汉式的线程安全问题

文章目录 一、单例设计模式的线程安全问题&#xff08;1&#xff09;饿汉式没有线程安全问题&#xff08;2&#xff09;懒汉式线程安全问题1、案例2、方式1-同步方法3、方式2-同步代码块4、优化 二、代码&#xff08;1&#xff09;实现线程安全的懒汉式&#xff08;2&#xff0…

【力扣白嫖日记】SQL

前言 练习SQL语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1387.使用唯一标识码替代员工ID 表&#xff1a;Employees 列名类型idintnamevarchar 在 SQL 中&#xff0c…

k8s安装dashboard报错CrashLoopBackOff

报错信息 使用kubectl get pods -A查看集群&#xff0c;出现错误&#xff1a; kubernetes-dashboard kubernetes-dashboard-xxxxxxxxxx6-2qrst 0/1 CrashLoopBackOff 6 15m查看日志后&#xff0c;发现原因&#xff1a; panic: Get "https://10…

Pandas 数据结构 – Pandas CSV 文件

Pandas CSV 文件 CSV&#xff08;Comma-Separated Values&#xff0c;逗号分隔值&#xff0c;有时也称为字符分隔值&#xff0c;因为分隔字符也可以不是逗号&#xff09;&#xff0c;其文件以纯文本形式存储表格数据&#xff08;数字和文本&#xff09;。 CSV 是一种通用的、…

【IC设计】Windows下基于IDEA的Chisel环境安装教程(图文并茂)

Chisel环境安装教程 第一步 安装jdk&#xff0c;配置环境变量第二步 安装sbt&#xff0c;不用配置环境变量第三步 安装idea社区版第四步 离线安装scala的idea插件第五步 配置sbt换源1.切换目录2.创建repositories文件3.配置sbtconfig.txt文件 第六步 使用chisel-tutorial工程运…

Android矩阵setRectToRect裁剪Bitmap原图Matrix放大,mapRect标记中心区域,Kotlin

Android矩阵setRectToRect裁剪Bitmap原图Matrix放大&#xff0c;mapRect标记中心区域&#xff0c;Kotlin import android.content.Context import android.graphics.Bitmap import android.graphics.Canvas import android.graphics.Color import android.graphics.Matrix impo…

数学知识第八期 组合数全集

前言&#xff1a;组合数在高中大家应该都学过&#xff0c;也是一个重要的数学知识&#xff0c;希望大家能够完全掌握 一、组合数基本知识 定义&#xff1a; 组合是数学的重要概念之一。从 n 个不同元素中每次取出 m 个不同元素 &#xff0c;不管其顺序合成一组&#xff0c;称…

YIA主题如何关闭新版本升级提示?WordPress主题怎么取消升级提醒?

前两天YIA主题发布了升级到2.8版本&#xff0c;新增了一些功能&#xff0c;优化调整修复了一些功能&#xff0c;但是这些功能调整幅度不大&#xff0c;加上boke112百科使用的YIA主题已经进行了很多方面的个性化修改&#xff0c;所以就懒得升级了&#xff0c;但是每次进入WordPr…

C++——数据类型

C——数据类型 1.基本变量类型 C 基本数据类型整理成表格。以下是一个表格&#xff0c;展示了不同的基本数据类型及其一般用途和大小范围&#xff1a;和C语言类似。 2.宽字符的用法 #include <iostream> #include <locale> #include <wchar.h> int main…

Vue(二十):ElementUI 扩展实现表格组件的拖拽行

效果 源码 注意&#xff1a; 表格组件必须添加 row-key 属性&#xff0c;用来优化表格的渲染 <template><el-row :gutter"10"><el-col :span"12"><el-card class"card"><el-scrollbar><span>注意: 表格组件…

FreeRTOS_Stm32F407系列单片机标准库移植

这里写目录标题 1、下载FreeRTOS源码1.1github仓库下载1.2官网下载1.3百度网盘下载 2、FreeRTOS移植2.1首先需要有一个可运行的标准库工程2.2在工程内创建一个FreeRTOS文件夹&#xff0c;然后在FreeRTOS文件夹中再新建port、include、src三个文件夹。2.3 port文件夹移植2.4 inc…

Android使用ScrollView导致鼠标点击事件无效

平台 测试平台: RK3288 Android8.1RK3588 Android 12 问题 首先, 这个问题的前提是, 使用的输入设备是**鼠标**, 普通的触摸屏并不会出现这个问题. 大致的流程是APP的UI布局中采用ScrollView作为根容器, 之后添加各类子控件, 在一起准备就绪后, 使用鼠标进行功能测试, 出现…

AD24-固定孔放置

1、固定孔放置的一般距离&#xff0c;分为金属和非金属 2、固定孔通过焊盘完成&#xff0c;放置焊盘&#xff0c;并将层修改为Multi Layer 焊盘与固定孔的等大小的 3、金属与非金属的区别 ①非金属 ②金属 4、设置固定孔放置的距离 5、通过复制粘贴即可完成其他孔的放置 6、导…

时间序列预测模型实战案例(二)(Holt-Winter)(Python)结合K-折交叉验证进行时间序列预测实现企业级预测精度(包括运行代码以及代码讲解)

目录 引言 数据格式 运行代码 Holt-Winters模型主体 程序入口 参数讲解 开始训练 预测结果 引言 话不多说上来先上预测精度分析图,其中MAE的误差大概在0.11,以下数据均是预测未知数据&#xff0c;而不是训练数据的预测图。 开始之前我们先来简单了解一下Holt-Winters…

数据结构+算法(第02篇):玩扫雷就是优化算法

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

网安渗透攻击作业(2)

sql注入第一关 一、部署 1、环境安装 &#xff08;1&#xff09;下载phpstudy&#xff0c;下载链接&#xff1a;小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01; &#xff0c;安装过后打开软件进入如下界面&#xff0c;接着我们开启nginx和mysql 注意&#x…