【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.mzph.cn/news/661640.shtml

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

相关文章

STM32CubeIDE 使用标准库来编写程序

这些天我想找一个软件来实现软件的替代。就找到了st 的生态。可是现在st 生态都在极力的推荐HAL 库,但是习惯了标准库的朋友们,还不是很习惯。 先上总结一下,为了好记忆: 一、 在编译栏做如下设置 1、头文件设置 2、源文件设置 二、指定具体的预定义宏 1、USE_STDPERIPH_D…

数据结构-图的最小生成树

最小生成树介绍 最小生成树(Minimum Cost Spanning Tree)是代价最小的连通网的生成树&#xff0c;即该生成树上的边的权值和最小 最小生成树的性质&#xff1a; 必须使用且仅使用连通网中的n-1条边来联结网络中的n个顶点&#xff1b; 不能使用产生回路的边&#xff1b; 各…

Linux部署幻兽帕鲁服务器,PalWorld开服联机教程,保姆级教程

------另一个号申请积分-------- Linux系统搭建PalWorld私服&#xff0c;幻兽帕鲁开服联机教程&#xff0c;保姆级教程 最近这游戏挺火&#xff0c;很多人想跟朋友联机&#xff0c;如果有专用服务器&#xff0c;就不需要房主一直开着电脑&#xff0c;稳定性也好得多。 幻兽帕…

Kubernetes operator(五)api 和 apimachinery 篇

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列第五篇&#xff0c;主要对 k8s.io/api 和 k8s.io/apimachinery 两个项目 进行学习基于 kubernetes v1.24.0 代码分析Kubernetes operator学习系列 快捷链接 Kubernetes operator&a…

大数据StarRocks(九):资源隔离实战

前言 自 2.2 版本起&#xff0c;StarRocks 支持资源组管理&#xff0c;集群可以通过设置资源组&#xff08;Resource Group&#xff09;的方式限制查询对资源的消耗&#xff0c;实现多租户之间的资源隔离与合理利用。在 2.3 版本中&#xff0c;StarRocks 支持限制大查询&#…

Android配置GitLab CI/CD持续集成,Shell版本的gitlab-runner,FastLane执行,上传蒲公英

mac环境下&#xff0c; 首选需要安装gitlab-runner和fastlane brew install gitlab-runner brew install fastlane 安装完成&#xff0c;来到我们在gitlab下新建的Android项目&#xff0c;我们开始创建gitlab-runner 1、创建runner 点开runner&#xff0c;点击新建runner …

自然语言nlp学习四

5-5 BMTrain--ZeRO_哔哩哔哩_bilibili 5-6 BMTrain--Pipeline Parallel (流水线并行)_哔哩哔哩_bilibili 5-12 BMCook--背景介绍_哔哩哔哩_bilibili 5-20 BMInf--背景介绍_哔哩哔哩_bilibili 6-7 机器问答--QA介绍_哔哩哔哩_bilibili 6-8 机器问答--阅读理解_哔哩哔哩_bilibili…

常用API1 ---Math

包含用于执行基本数学运算的方法&#xff0c;如初等指数、对数、平方根和三角函数。 常用方法&#xff1a; package MyApi.a01mathdemo01;public class MathDemo01 {public static void main(String[] args) {//abs 获取参数的绝对值System.out.println(Math.abs(-88));System…

江科大stm32学习笔记10——对射式红外传感器

一、接线 上电之后可以看到对射式红外传感器亮两个灯&#xff0c;如果此时用挡光片挡住两个黑色方块中间的部分&#xff0c;则只亮一个灯。 二、代码 将4-1的工程文件夹复制粘贴一份&#xff0c;重命名为“5-1 对射式红外传感器计次”&#xff0c;打开keil&#xff0c;右键添…

认识 SYN Flood 攻击

文章目录 1.什么是 SYN Flood 攻击&#xff1f;2.半连接与全连接队列3.如何防范 SYN Flood 攻击&#xff1f;参考文献 1.什么是 SYN Flood 攻击&#xff1f; SYN Flood 是互联网上最原始、最经典的 DDoS&#xff08;Distributed Denial of Service&#xff09;攻击之一。 SYN…

[C#][opencvsharp]opencvsharp sift和surf特征点匹配

SIFT特征和SURF特征比较 SIFT特征基本介绍 SIFT(Scale-Invariant Feature Transform)特征检测关键特征&#xff1a; 建立尺度空间&#xff0c;寻找极值关键点定位&#xff08;寻找关键点准确位置与删除弱边缘&#xff09;关键点方向指定关键点描述子 建立尺度空间&#xff0…

SpringBoot RestTemplate 设置挡板

项目结构 代码 BaffleConfig /*** Description 记录配置信息* Author wjx* Date 2024/2/1 14:47**/ public interface BaffleConfig {// 是否开启挡板的开关public static boolean SWITCH true;// 文件根目录public static String ROOT_PATH "D:\\TIS\\mock";// …

最新2024如何解决谷歌浏览器Chrome谷歌翻译无法使用问题

快速恢复谷歌浏览器一键翻译功能在Chrome 中安装好【翻译】插件 Macbook 操作步骤&#xff1a; 1点击“前往”&#xff0c;打开“前往文件夹” 2 在对话框中输入“/etc” 囝找到“hosts”文件&#xff0c;复制粘贴到桌面 3 在复制的文件最后新起一行&#xff0c;输入并保存&am…

VUE3+TS使用OpenSeadragon学习之旅,实现多图片切换效果

1.官方网站&#xff1a;OpenSeadragon 2.使用npm下载插件&#xff1a;npm install openseadragon 3.在 index.html文件引入资源 <link rel"stylesheet" href"node_modules/openseadragon/build/openseadragon/openseadragon.css" /><script src…

消息队列的应用场景

消息队列的应用场景 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构使用较多的消息队列有ActiveMQ&#xff0c;RabbitMQ&#xff0c;Ze…

用户界面(UI)、用户体验(UE)和用户体验(UX)的差异

对一个应用程序而言&#xff0c;UX/UE (user experience) 设计和 UI (user interface) 设计非常重要。UX设计包括可视化布局、信息结构、可用性、图形、互动等多个方面。UI设计也属于UX范畴。正是因为三者在一定程度上具有重叠的工作内容&#xff0c;很多从业多年的设计师都分不…

ffmpeg合成mp3音频,解决音频属性不一致问题

1. 需求&#xff0c;amr转成mp3&#xff0c;再将此mp3和其他mp3合成 2. 问题&#xff1a;拼接后的第一段音频可以播放&#xff0c;第二段自动跳过&#xff0c;无法播放。 3. 解决&#xff1a; 3.1 查看各文件属性 # 查看amr转为mp3文件的属性&#xff1a;ffprobe 文件名&am…

嵌入式软件工程师面试题——2025校招社招通用(C/C++)(五十一)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

C语言实现12种排序算法

1.冒泡排序 思路&#xff1a;比较相邻的两个数字&#xff0c;如果前一个数字大&#xff0c;那么就交换两个数字&#xff0c;直到有序。 时间复杂度&#xff1a;O(n^2)&#xff0c;稳定性&#xff1a;这是一种稳定的算法。 代码实现&#xff1a; void bubble_sort(int arr[],…

Redis的bitmap使用不当,我内存爆了

背景 最近发现Redis的内存持续暴涨&#xff0c; 涨的有点吓人&#xff0c;机器都快扛不住了&#xff0c;不得不进行Redis内存可视化分析&#xff0c;发现大量的String类型的大key 经分析&#xff0c;最近上线了页面UV的统计&#xff0c;那目前如何做的呢&#xff1f; 通过访…