当前位置: 首页 > 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函数

​​​​​​​

http://www.xdnf.cn/news/260965.html

相关文章:

  • Python 装饰器优化策略模式:电商促销折扣的优雅解法
  • 【网络原理】深入理解HTTPS协议
  • 多多铃声 7.4| 拥有丰富的铃声曲库,满足不同用户的个性化需求,支持一键设置手机铃声
  • 接口隔离原则(ISP)
  • 「Mac畅玩AIGC与多模态15」开发篇11 - 增加输入变量的工作流示例
  • 用定时器做微妙延时注意事项
  • LOJ #193 线段树历史和 Solution
  • day13 python不平衡数据集的处理(补)
  • 数字智慧方案5857丨智慧机场解决方案与应用(53页PPT)(文末有下载方式)
  • 分享国产AI工作流集成数据库完成业务处理
  • apt-mirror搭建ubuntu本地离线源
  • 文件操作--文件下载读取漏洞
  • JavaScript基础-赋值运算符
  • python数据分析(七):Pandas 数据变形与重塑
  • DeepSeek实战--AI技术架构(持续更新)
  • Performance API 性能上报
  • 2025年- H21-Lc129-160. 相交链表(链表)---java版
  • 字符和编码(python)
  • 依赖倒置原则(DIP)
  • 实战交易策略 篇二十二:情绪流龙头交易策略
  • 特殊运算符详解:身份运算符、成员运算符与三目运算符
  • 位运算符详解:从入门到精通
  • 【C++】红黑树迭代版
  • 算法技巧——打表
  • 双向链表详解
  • 如何在纯C中实现类、继承和多态(小白友好版)
  • 测试——用例篇
  • 计算机启动流程中,都干了啥事。比如文件挂在,操作系统加载,中断向量表加载,磁盘初始化在哪阶段。
  • 动态思维——AI与思维模型【91】
  • python入门(1)变量与输入输出