视频链接
https://www.bilibili.com/video/BV1yf4y1A7ek/?p=2&spm_id_from=pageDriver&vd_source=fa4ef8f26ae084f9b5f70a5f87e9e41b
Json
JSON是在网络传输中常用的数据格式,能将不同类型的数据统一起来,我们在发送数据前将不同类型的数据存入到JSON中,到客户端后再把JSON中数据一步步解析下来,从而得到我们发送的数据
Json中有两种数据格式:Json数组和Json对象
Json数组
Json对象
Json对象用 {} 来描述,每个Json对象里可以存放若干个元素,每个元素对应一个键值对,元素和元素之间用 **逗号 ,**来间隔,最后一个元素没有逗号,需要注意
1. 键(key)必须是字符串类型,位于同一层级的键值对不要重复(因为要通过key来取value的值)
2. value的值是可选的,可以根据实际情况来使用,可用类型包括:整形、浮点型、字符串、布尔类型、json数组,json对象
注意事项
Json结构简单,但是在嵌套时可以完成比较复杂的业务逻辑,在实际使用中需要我们对业务求进行拆解分析建模,最后使用合适Json数据完成我们的需求
使用时需要注意一下事项
1.无论是使用Json数组和Json对象,里面的最后一个数据后不能再加逗号且key的值必须唯一,否则会导致数据无法正常解析
2.如果需要将Json数据持久化到磁盘里,一般会添加一个.json后缀结尾的文件
3.一个Json文件里,要么只有一个Json对象,要么只有一个Json数组
原因:.json文件是以树状结构来管理的,一个Json对象或者Json数组作为这棵树的根节点,他们中的元素作为这棵树的子节点,子节点可以有很多,元素也可以嵌套,但是根节点只能有一个!读取数据时根据key就能读取到对应的数据
Qt中Json的使用
Qt 5.0后提供了有关Json类的支持,我们可以直接使用这些Qt封装好的类对Json数据进行处理,具体如下
QJsonValue类
QJsonValue相当于将不同的数据类型放到了一个统一的盒子里,盒子外面贴的什么标签(比如整形,浮点型),那么我们就认为它是什么东西,(实际使用时有对应的函数来判断是什么类型),减少了需要提供的接口的数量,减少了学习成本和使用难度
- is相关的API可以判断QJsonValue里面封装的是什么
- to相关的API可以将QJsonValue里面的数据转换为对应的类型
- 构造函数相关的重载表示将某种类型的数据封装成QJsonValue类型
QJsonValue中的API不需要特意去记忆,需要就查,放在这里便于查询和记录
QJsonObject类
QJsonObject封装了Json中的对象,里面可以存储多个键值对,键(key)的类型必须是字符串,而值(value)类型是QJsonValue类型
QJsonObject内部的元素是由红黑树维护的,红黑树默认会对存储的元素进行一个升序排序,所以在遍历时会出现遍历顺序与插入顺序不一致的情况
这个类的使用与C++的STL类似,比如
第三中遍历方法比较常见
先拿到所有key,这些key被存放到QStringList中,然后再对QStringList进行遍历
QJsonArray
这个类封装了Json中的数组,为了方便操作,这个数组里存放的类型是QJsonValue类型,使用也类似STL,下标从0开始
下列函数中,最后一个参数得到的是引用,可以对此元素进行修改,其他函数只能得到拷贝。即修改无效
注意:使用API得到数据后,并不是我们需要的原始数据,因为得到数据类型是QJsonValue类型,我们需要对取到的数据进行类型判断再调用相关的to方法才能得到我们原来想要的原始数据
QJsonDocument
- set方法可以将Array和Object方法封装到对应的QJsonDocument中
- to方法实现将QJsonDocument文档里的数据转换成字符串类型
- is方法实现判断有关的功能
静态方法能将字符串类型(QByteArray)类型转换成Document类型,有了Document就能通过is方法 + object/array方法转换成对应的对象类型或者是数组类型,这样就能对他们进行操作了
Json对数据的序列化和反序列化
数据序列化流程
转换流程:先有QJsonObject或者QJsonArray => QJsonDocument => Json =>数据传输或者写入磁盘
数据反序列化流程
注意:
1.不要试图写出一套通用解析所有Json数据的代码!!针对不同格式的Json数据写出对应的读写代码就可以了,怎样的组成就怎么读
2.当需要对Json文件中的数据进行增删改查时,直接将对应的Json文件中的数据导入内存中,然后在内存进行修改,修改完之后再将改好的数据写回原文件中(相当于对原来文件的数据进行覆盖)