Qt Json详细介绍

一.概念介绍

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输和存储。它具有以下特点:

  1. 易读性:JSON 使用人类可读的文本格式表示数据,采用键值对的方式组织数据,易于阅读和编辑。

  2. 轻量级:JSON 数据格式较为简洁,不包含冗余信息,适合网络传输和存储。

  3. 自描述性:JSON 数据的结构清晰明了,键值对以及数组的嵌套结构能够清晰地表示复杂数据。

  4. 易于解析:JSON 数据可以方便地被解析成多种编程语言中的数据结构,如对象、数组等。

  5. 跨平台兼容:由于 JSON 是一种文本格式,不依赖特定的编程语言,能够被多种编程语言解析和生成。

JSON 数据通常由对象(Object)和数组(Array)组成:

  • 对象(Object):由一组键值对构成,使用大括号 {} 表示。示例:{“name”: “Alice”, “age”: 30}
  • 数组(Array):由一组值构成,使用中括号 [] 表示。数组中的元素可以是对象、数组或基本数据类型。示例:[“apple”, “banana”, “cherry”]

总之,JSON 是一种简单、轻量级、易读的数据交换格式,被广泛应用于 Web 开发、API 设计和数据交换等领域。通过了解 JSON 的基本概念和语法规则,可以更好地进行数据交互与处理。

二.重要的部分介绍

1. QJsonDocument:

  • QJsonDocument 类用于表示整个 JSON 文档,可以包含一个 JSON 对象或一个 JSON 数组。
  • 可以使用该类来创建、读取、写入和操作 JSON 数据。
  • 成员函数:toJson() 将 JSON 文档转换为字符串,fromJson() 从字符串中解析 JSON 数据。

示例代码如下:

#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建 JSON 对象QJsonObject personObject;personObject["name"] = "Alice";personObject["age"] = 30;personObject["isStudent"] = true;QJsonArray fruitsArray = {"apple", "banana", "cherry"};personObject["favoriteFruits"] = fruitsArray;QJsonObject addressObject;addressObject["city"] = "New York";addressObject["zipcode"] = "10001";personObject["address"] = addressObject;// 将 JSON 对象转换为 JSON 文档QJsonDocument jsonDocument(personObject);// 将 JSON 文档转换为 JSON 字符串QString jsonString = jsonDocument.toJson();qDebug() << "Generated JSON string:" << jsonString;// 解析 JSON 字符串为 JSON 文档QJsonDocument parsedDocument = QJsonDocument::fromJson(jsonString.toUtf8());if (!parsedDocument.isNull() && parsedDocument.isObject()) {QJsonObject parsedObject = parsedDocument.object();QString name = parsedObject["name"].toString();int age = parsedObject["age"].toInt();bool isStudent = parsedObject["isStudent"].toBool();qDebug() << "Parsed name:" << name;qDebug() << "Parsed age:" << age;qDebug() << "Parsed isStudent:" << isStudent;} else {qDebug() << "Failed to parse JSON";}return a.exec();
}

2.QJsonObject(这和map很相似)

  • QJsonObject 类用于表示 JSON 对象,它是键值对的集合,其中键为字符串,值可以是字符串、整数、布尔值、对象或数组。
  • 可以通过下标操作符 [] 或 insert() 方法来添加键值对。
  • 成员函数:value() 可以获取指定键对应的值,contains() 用于检查是否包含指定键。

示例代码如下:

#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建一个空的 JSON 对象QJsonObject personObject;// 添加键值对到 JSON 对象personObject["name"] = "Alice";personObject["age"] = 30;personObject["isStudent"] = true;// 创建包含一组值的 JSON 数组QJsonArray fruitsArray = {"apple", "banana", "cherry"};personObject["favoriteFruits"] = fruitsArray;// 创建一个嵌套的 JSON 对象QJsonObject addressObject;addressObject["city"] = "New York";addressObject["zipcode"] = "10001";personObject["address"] = addressObject;// 访问和输出 JSON 对象中的值qDebug() << "Name:" << personObject["name"].toString();qDebug() << "Age:" << personObject["age"].toInt();qDebug() << "Is Student:" << personObject["isStudent"].toBool();// 访问嵌套的 JSON 对象中的值QJsonObject nestedAddress = personObject["address"].toObject();qDebug() << "City:" << nestedAddress["city"].toString();qDebug() << "Zipcode:" << nestedAddress["zipcode"].toString();// 修改 JSON 对象中的值personObject["age"] = 35;// 移除 JSON 对象中的某个键值对personObject.remove("isStudent");// 转换 JSON 对象为字符串QJsonDocument jsonDocument(personObject);QString jsonString = jsonDocument.toJson();qDebug() << "Updated JSON object:" << jsonString;return a.exec();
}

3. QJsonArray

  • QJsonArray 类用于表示 JSON 数组,它是值的有序集合,值可以是字符串、整数、布尔值、对象或数组。
  • 可以使用 append()、insert()、at() 等方法操作数组元素。
  • 成员函数:size() 返回数组中元素的数量,at() 根据索引获取指定位置的元素。
#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建一个空的 JSON 数组QJsonArray fruitsArray;// 向 JSON 数组添加元素fruitsArray.append("apple");fruitsArray.append("banana");fruitsArray.append("cherry");// 创建一个包含多个不同类型元素的 JSON 数组QJsonArray mixedArray;mixedArray.append(10);mixedArray.append(true);mixedArray.append("hello");// 输出数组元素qDebug() << "Fruits in the array:";for(const QJsonValue &value : fruitsArray) {qDebug() << value.toString();}qDebug() << "Elements in mixed array:";for(const QJsonValue &value : mixedArray) {if(value.isBool()) {qDebug() << value.toBool();} else if(value.isDouble()) {qDebug() << value.toDouble();} else if(value.isString()) {qDebug() << value.toString();}}// 访问数组元素qDebug() << "First fruit:" << fruitsArray.at(0).toString();qDebug() << "Last fruit:" << fruitsArray.last().toString();// 修改数组元素fruitsArray.replace(1, "pear");// 移除数组元素fruitsArray.removeAt(2);// 转换 JSON 数组为字符串QJsonDocument jsonDocument(fruitsArray);QString jsonString = jsonDocument.toJson();qDebug() << "Updated JSON array:" << jsonString;return a.exec();
}

4.JSON 数据的解析

  • 使用 QJsonDocument::fromJson() 将 JSON 字符串解析为 QJsonDocument 对象。
  • 判断解析后的对象类型(是对象还是数组),然后获取各个属性的值。

5. QString与QByteArray

在 Qt 中,QString 和 QByteArray 是两种用于处理字符串数据的类,它们在存储和操作字符串上有一些不同之处。下面是关于 QString 和 QByteArray 的详细介绍:

QString

  • QString 是 Qt 中用于表示 Unicode 字符串的类,它支持多种字符编码,包括 UTF-8、UTF-16 等。

  • 特点:

  1. 支持 Unicode 字符,可以表示任意国家地区的字符。
  2. 自动转码:QString 会自动处理不同字符编码之间的转换。例如,可以使用 toUtf8() 方法将 QString 转换为 QByteArray。
  3. 提供了丰富的字符串操作方法,如拼接、查找、替换、大小写转换等。

使用场景:

  • 存储用户界面文本、表示用户输入。
  • 作为跨平台的字符串处理工具,便于处理各种字符编码和国际化需求。

QByteArray

  • QByteArray 是 Qt 中用于表示字节数据的类,通常用于存储二进制数据或者不包含特定字符编码的文本数据。

特点:

  1. 与 QString 不同,QByteArray 主要是字节级别的操作,适用于处理二进制数据。
  2. 通常用于读写文件、网络数据、加密解密等场景。
  3. 字节数据一般不涉及字符编码的转换,更适合存储不特定编码的数据。

使用场景:

  • 存储二进制数据,如图片、音频、视频等。
  • 读写文件内容,处理网络数据传输。
  • 加密解密操作等需要处理字节数据的场景。

总结

  • 如果需要处理文本数据,并且涉及到字符串操作、多语言支持或者用户界面相关的文本处理,通常使用 QString。

  • 如果处理的数据为字节数据、二进制数据或者不需要特定字符编码的数据,可以使用 QByteArray。

三.JSON读写文件实战

  • Json格式如下:
{"Name":"Ace","Sex":"man","Age":20,"Family":{"Father":"Gol·D·Roger","Mother":"Portgas·D·Rouge","Brother":["Sabo", "Monkey D. Luffy"]},"IsAlive":false,"Comment":"yyds"
}
  • 写文件
void MainWindow::writeJson()
{//创建一个Json对象QJsonObject obj;//对象可以说是和map一模一样//"Ace"发生了隐式类型转换obj.insert("name","Ace");obj.insert("sex","man");obj.insert("age",20);//创建子对象QJsonObject subObj;subObj.insert("father","Gol·D·Roger");subObj.insert("Mother","Portgas·D·Rouge");//构建一个Json数组的对象QJsonArray array;array.append("Sabo");array.append("Monkey D. Luffy");subObj.insert("Brother",array);obj.insert("Family",subObj);obj.insert("IsAlive",false);obj.insert("Comment","yyds");//将json的对象转换成文档类型QJsonDocument doc(obj);//将其转换成字符串类型,QByteArray在qt中就是表示字符串QByteArray json = doc.toJson();//写入磁盘文件中QFile file("G:\\qtcodetest\\QJsonTest\\mytest.json");file.open(QFile::WriteOnly);file.write(json);file.close();}
  • 读文件
void MainWindow::readJson()
{//读文件QFile file("G:\\qtcodetest\\QJsonTest\\mytest.json");file.open(QFile::ReadOnly);QByteArray all = file.readAll();file.close();//读出的文件进行转换QJsonDocument doc = QJsonDocument::fromJson(all);if(doc.isObject()){QJsonObject obj = doc.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 i=0; i<ls.size(); ++i){QJsonValue subVal = subObj.value(ls.at(i));if(subVal.isString()){qDebug() << "   " << ls.at(i) << ":" << subVal.toString();}if(subVal.isArray()){QJsonArray array = subVal.toArray();qDebug() << "   " << ls.at(i) << ":";for(int j=0; j<array.size(); ++j){// 因为知道数组内部全部为字符串, 不再对元素类型进行判断qDebug() << "       " << array[j].toString();}}}}}}
}

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

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

相关文章

eth0设备繁忙

当您遇到 ifconfig eth0 hw ether 20:24:07:04:18:00 命令执行后显示 ifconfig: SIOCSIFHWADDR: Device or resource busy 错误时&#xff0c;这意味着您尝试更改的网络设备&#xff08;在这个例子中是 eth0&#xff09;目前正被占用&#xff0c;无法进行硬件地址的更改。 为了…

Map Set(Java篇详解)

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;Java专栏&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ 等 &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&#x1f496;三连支持…

【每日一练】python列表

1、输入一个整数列表&#xff0c;将列表中的元素按照逆序输出。 list1[5,4,5,6] list1.reverse() print(list1)[6, 5, 4, 5]2、输入一个字符串列表&#xff0c;输出其中长度大于等于5的字符串&#xff0c;并且将它们转换为大写形式。 list1[hello,lol,ak47,aliang] for i in …

211.xv6——3(page tables)

在本实验室中&#xff0c;您将探索页表并对其进行修改&#xff0c;以简化将数据从用户空间复制到内核空间的函数。 开始编码之前&#xff0c;请阅读xv6手册的第3章和相关文件&#xff1a; kernel/memlayout.h&#xff0c;它捕获了内存的布局。kernel/vm.c&#xff0c;其中包含…

代谢组数据分析(十二):岭回归、Lasso回归、弹性网络回归构建预测模型

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2介绍 在代谢物预测模型的构建中,我们采用了三种主流的回归分析方法:岭回归、Lasso回归以及弹性网络回归。这三种方法各有其独特的原理和适用场景,因此在…

WPS操作技巧:制作可以打对勾的方框,只需简单几步!沈阳wps办公软件培训

日常工作中&#xff0c;我们经常需要在表格中添加复选框&#xff0c;比如【性别选择】、【任务完成状态】等等&#xff0c;通过打对勾来确定状态。今天就分别从WPS的Excel表格和Word文档2种场景&#xff0c;介绍制作可以打对勾的复选框的方法技巧&#xff0c;掌握技巧&#xff…

25、PHP 实现两个链表的第一个公共结点(含源码)

题目&#xff1a; PHP 实现两个链表的第一个公共结点 描述&#xff1a; 输入两个链表&#xff0c;找出它们的第一个公共结点。 <?php /*class ListNode{var $val;var $next NULL;function __construct($x){$this->val $x;} }*/ function FindFirstCommonNode($pHead…

构建zdppy docker镜像

拉取镜像 docker pull python:3.8-alpine3.19创建容器 docker run -itd --name zdppy python:3.8-alpine3.19 sh进入容器 docker exec -it zdppy sh配置pip国内源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple提交容器为镜像 docker commit…

游戏AI的创造思路-技术基础-计算机视觉

让游戏的AI具备“眼睛”和“视觉”&#xff0c;就是通过计算机视觉的方法进行的。现在&#xff0c;越来越多的游戏&#xff0c;特别是动捕类游戏都在使用这个方法。当然&#xff0c;计算机视觉不仅仅用于游戏&#xff0c;越来越多的应用使用到这个技术 目录 1. 定义 2. 发展历…

spring 枚举、策略模式、InitializingBean初使化组合使用示例

实现一个简单的文本处理系统。 在这个系统中&#xff0c;我们将定义不同类型的文本处理策略&#xff0c;比如大小写转换、添加前缀后缀等&#xff0c;并使用工厂模式来管理这些策略。 1 定义一个枚举来标识不同的文本处理类型 public enum TextProcessTypeEnum {UPPER_CASE,LO…

腾讯混元文生图开源模型推出小显存版本,6G显存即可运行,并开源caption模型

7月4日&#xff0c;腾讯混元文生图大模型&#xff08;混元DiT&#xff09;宣布开源小显存版本&#xff0c;仅需6G显存即可运行&#xff0c;对使用个人电脑本地部署的开发者十分友好&#xff0c;该版本与LoRA、ControlNet等插件&#xff0c;都已适配至Diffusers库&#xff1b;并…

探索 Apache Paimon 在阿里智能引擎的应用场景

摘要&#xff1a;本文整理自Apache Yarn && Flink Contributor&#xff0c;阿里巴巴智能引擎事业部技术专家王伟骏&#xff08;鸿历&#xff09;老师在 5月16日 Streaming Lakehouse Meetup Online 上的分享。内容主要分为以下三个部分&#xff1a; 一、 阿里智能引擎…

【LeetCode】全排列

目录 一、题目二、解法完整代码 一、题目 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] …

LVS+Nginx高可用集群--基础篇

1.集群概述 单体部署&#xff1a; 可以将上面内容分别部署在不同的服务器上。 单体架构的优点&#xff1a; 小团队成型就可完成开发&#xff0c;测试&#xff0c;上线 迭代周期短&#xff0c;速度快 打包方便&#xff0c;运维简单 单体架构的挑战&#xff1a;单节点宕机造成…

DVWA sql手注学习(巨详细不含sqlmap)

这篇文章主要记录学习sql注入的过程中遇到的问题已经一点学习感悟&#xff0c;过程图片会比较多&#xff0c;比较基础和详细&#xff0c;不存在看不懂哪一步的过程 文章目录 靶场介绍SQL注入 lowSQL注入 MediumSQL注入 HighSQL注入 Impossible 靶场介绍 DVWA&#xff08;Damn…

必备的 Adobe XD 辅助工具

想要高效便捷的使用 Adobe XD&#xff0c; Adobe XD 插件是必不可少的&#xff0c; Adobe XD 的插件非常多&#xff0c;但 90%都是英文&#xff0c;并且良莠不齐。在这儿挑选 9 个好用的 Adobe XD 插件给大家&#xff0c;这里是我整理的一些实用 Adobe XD 插件&#xff0c;让你…

大屏开发系列——Echarts的基础使用

本文为个人近期学习总结&#xff0c;若有错误之处&#xff0c;欢迎指出&#xff01; Echarts在vue2中的基础使用 一、简单介绍二、基本使用&#xff08;vue2中&#xff09;1.npm安装2.main.js引入3.使用步骤(1)准备带有宽高的DOM容器&#xff1b;(2)初始化echarts实例&#xff…

gcc: warning: -Wunused-function;加了选项,为什么就不报警告呢?

文章目录 问题clang的编译而使用gcc是就不报问题分析原因如果是非static的函数问题 下面这个代码段,其中这个函数hton_ext_2byte,在整个程序里就没有使用。 static inline uint16_t hton_ext_2byte(uint8_t **p) {uint16_t v;******return v;

PHP宜邦家政服务管理系统-计算机毕业设计源码04426

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2开发现状 1.3论文结构与章节安排 2 宜邦家政服务管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用…

国标GB28181视频汇聚平台LntonCVS视频监控安防平台与国标协议对接解决方案

应急管理部门以“以信息化推动应急管理能力现代化”为总体目标&#xff0c;加快现代信息技术与应急管理业务深度融合&#xff0c;全面支持现代应急管理体系建设&#xff0c;这不仅是国家加强和改进应急管理工作的关键举措&#xff0c;也是应对日益严峻的应急管理形势和满足公众…