当前位置: 首页 > news >正文

QT中的JSON

1.JSON的两种数据格式

JSON有两种数据格式:JSON对象和JSON数组

JSON数组:

JSON数组格式:[元素1,元素2,元素3,......元素n]

JSON数组中的元素可以是同一类型,也可以使不同类型,可以嵌套JSON数组或JSON对象

JSON对象:

JSON对象格式:{“key1:” : value1, “key2” : value2 , “key3” : value3 }

JSON对象内部使用键值对的方式来组织,键是字符串类型,值可以为多种类型,也可以为JSON数组或JSON对象

​​​​​​​1.2 JSON在线解析

JSON本质就是一种特殊格式的字符串

收到的json字符串是压缩格式,没有换行和缩进,不便于判断格式是否正确

可以通过JSON在线解析工具来校验JSON的格式是否正确

在json.cn进行查看

2.Qt中JSON的使用

Qt中提供JSON类,便于生成和解析JSON字符串

相关JSON类:

QJsonObject

QJsonArray

QJsonValue

QJsonDocument

​​​​​​​2.1 QJsonObject

QJsonObject封装了JSON中的对象,可以存储多个键值对,键为字符串类型,值为QJsonValue类型

常用方法

方法

说明

QJsonObject()

创建一个空的QJsonObject对象

bool contains(const QString&key) const

查对象中是否包含给定的键

int count() const

返回对象中包含的键值对数量,与size()函数功能相同

bool empty() const

检查对象是否为空

QJsonObject::iterator find(const QString&key)

返回一个迭代器,指向具有指定键的键值对。如果未找到,则返回end()

QJsonObject::iterator erase(QJsonObject::iterator it)

从对象中删除迭代器所指向的键值对,并返回指向下一个键值对的迭代器

JsonObject::iterator insert(const QString&key,const QJsonValue&value)

向对象中添加一个新的键值对

QJsonObject::iterator begin()

返回一个迭代器,指向对象中的第一个键值对

QJsonObject::iterator end()

返回一个迭代器,指向对象中的“尾后”位置

QJsonObject::const_iterator find(const QString&key) const

返回一个常量迭代器,指向具有指定键的键值对

例:

​​​​​​​2.2QJsonArray

QJsonArray封装了JSON中的数组,数组中元素的类型统一为QJsonValue类型

常用方法

方法

说明

append(const QJsonValue &value)

在数组末尾添加一个QJsonValue

at(int i) const

返回数组中索引为i的QJsonValue

contains(const QJsonValue &value) const

检查数组是否包含特定的QJsonValue

size() const

返回数组中的元素数量

removeAt(int i)

删除数组中索引为i的元素

takeAt(int i)

取出并删除数组中索引为i的元素

insert(int i, const QJsonValue& value)

将元素插入到指定索引处

​​​​​​​2.3QJsonValue

QJsonValue封装了JSON支持的六种数据类型:

Bool  ,Double,  String,  QJSonArray,  QJSonObject,  Null

获取到QJsonValue对象后,可以通过判断函数来确定其封装的类型

方法

bool isString() const;

bool isDouble() const;

bool isBool() const;

bool isObject() const;          ---QJsonObject    

bool isArray() const;           ---QJsonArray

bool isUndefined() const;      ---是否为未识别的类

bool isNull() ocnst;

获取到QJsonValue封装的类型后,可以通过函数进行转换

方法

QString toString() const;

QString toString(const QString &defaultValue) const;

double todouble(double defaultValue=0) const;

int toInt(int defaultValue=0) const;

bool toBool(bool defaultValue=false) const;

QJsonObject toObject(const QJsonObject &defaultValue) const;

QJsonObject toObject() const;

QJsonArray toArray(const QJsonArray &defaultValue) cosnt;

QJsonArray toArray() const;

​​​​​​​2.4QJsonDocument

QJsonDocument封装了一个完整的JSON文档

可以从UTF-8编码基于文本的表示,以及Qt本身的二进制格式读取和写入该文档

QJsonObject和QJsonArray这两种对象是不能直接转换为字符串类型的,需要通过QJsonDocument类来完成二者的转换

构建json字符串方法:

将得到的QJsonObject/QJsonArray转换成字符串

//1.以QJsonObject/QJsonArray为参数创建QJsonDocument对象

QJsonDocument ::QJsonDocument(const QJsonObject &object);

QJsonDocument ::QJsonDocument(const QJsonArray &array);

//2.对QJsonDocument对象中的数据进行序列化,转化成json字符串

QByteArray QJsonDocument::toBinaryData() const;  ---二进制格式

QByteArray QJsonDocument::toJson(JsonFormat format=Indented) const;   ---文本格式

解析json字符串方法

将得到的JSON格式的字符串转化成其封装的对应类型的数据

//1,将JSON字符串---二进制格式或字符串格式转换成QJsonDocument对象

QJsonDocument::formBinaryData(const QByteArray &data,DataValidation validation=Validate);

QJsonDocument::formJson(const QByteArray &json,QJsonParseError *error=Q_NULLPTR);

//2.将QJsonDocument对象转换成json数组/对象

//先判断为json数组还是json对象

bool QJsonDocument::isArray() const;

bool QJsonDocument::isObject() const;

//再转化

QJsonObject QJsonDocument::object() const;

QJsonArray QJsonDocument::array() const;

//3.再通过QJsonArray/QJsonObject的相关方法判断其存储类型,将数据转换为对应类型

例如:

构建JSON字符串---用于向服务端发送消息

创建一个基类为QWidget的文件,在头文件类中声明构建json字符串的函数

在widget构造函数中调用writeJson

转到定义

运行后输出json字符串

格式化输出:

toUtf8()
        将 QString 转换为 QByteArray(UTF-8 编码的字节流),此时字符串中的换行符(\n)和缩进(空格)会被保留。

data()
        返回 QByteArray 的 const char* 指针,qDebug() 会将其视为普通 C 字符串处理,直接按原始内容输出,包括换行和缩进。

将JSON字符串写入文件

解析JSON字符串---用于接收收到的json字符串

在widget.h的类中声明解析json字符串的函数

在widget构造函数中调用

实现readJson函数

​​​​​​​

相关文章:

  • MIT6.S081-lab8前置
  • 硬件零基础入门(尚硅谷)
  • 3392. 统计符合条件长度为 3 的子数组数目
  • UDP网络编程
  • python使用cv2在图片上话矩形框
  • 数据结构的基本概念以及算法的基本内容
  • [UVM]在SoC中用寄存器模型backdoor访问寄存器的案例
  • MaC QT 槽函数和Lambda表达式
  • 打印Activity的调用者
  • 2444. 统计定界子数组的数目
  • 简介QML中的Canvas
  • 【Mytais系列】SqlSession
  • 传奇各版本迭代时间及内容变化,屠龙/嗜魂法杖/逍遥扇第一次出现的时间和版本
  • JVM——JVM 是如何处理异常的?
  • 双指针算法详解(含力扣和蓝桥杯例题)
  • 《计算机系统结构》考题知识点整理
  • 用可视化学习双指针法
  • 视频编解码学习一之相关学科
  • 数学实验Matlab
  • 自定义Dagster I/O管理器:灵活管理数据输入输出
  • 世锦赛决赛今夜打响,斯诺克运动需要赵心童创造历史
  • 产假工资是谁出?女职工生育能领多少生育津贴?解答来了
  • 特朗普称将禁止伊朗石油买家与美国做生意
  • 扬州市中医院“药膳面包”走红,内含党参、黄芪等中药材
  • 上海科创再出发:“造星”的城和“摘星”的人
  • 徐徕任上海浦东新区副区长