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函数