Qt中的JSON操作_2:JSON在Qt中的使⽤(QJsonValue数据类型包装与转
换、。。。
接上篇:,本篇介绍JSON在Qt中封装的类及其使⽤⽅法。
1. Qt中的Json类
从 Qt 5.0 开始提供了对 Json 的⽀持,我们可以直接使⽤ Qt 提供的 Json 类进⾏数据的组织和解析。相关的类常⽤的主要有四个,具体如下:
Json 类介绍
QJsonDocument它封装了⼀个完整的 JSON ⽂档,并且可以从 UTF-8 编码的基于⽂本的表⽰以及 Qt ⾃⼰的⼆进制格式读取和写⼊该⽂档。
QJsonArray JSON 数组是⼀个值列表。可以通过从数组中插⼊和删除 QJsonValue 来操作该列表。
QJsonObject JSON 对象是键值对的列表,其中键是唯⼀的字符串,值由 QJsonValue 表⽰。
QJsonValue该类封装了 JSON ⽀持的数据类型。
QJsonDocument的作⽤:
上⽂知JSON⼀共有两种格式,即JSON数组和JSON对象,它们最终要利⽤JSON完成序列化,将数据转换为对应的字符串,或者有另外⼀种情况是字符串转换为JSON数组和JSON对象。QJsonDocument就起到了转换器的作⽤,是转换的纽带。其过程如下图所⽰
QJsonArray的作⽤: 封装了Json⾥的数组。
QJsonObject的作⽤: 封装了Json⾥的对象。
QJsonValue的作⽤: 是对前⾯调到的数据类型的包装,C++中针对不同的数据类型有不同的声明,QJsonValue类是利⽤构造函数将各种数据类型进⾏了统⼀化,包装成⼀种类型,操作更为简单。
2. QJsonValue
在 Qt 中 QJsonValue 可以封装的基础数据类型有六种(和 Json ⽀持的类型⼀致),分别为:
(1)布尔类型:QJsonValue::Bool
(2)浮点类型(包括整形): QJsonValue::Double
(3)字符串类型: QJsonValue::String
(4)Json 数组类型: QJsonValue::Array
(5)Json 对象类型:QJsonValue::Object
(6)空值类型: QJsonValue::Null
(1)各种类型可以通过 QJsonValue 的构造函数被封装为⼀个类对象:
查看其帮助⽂档可以看到,通过不同的重载构造函数,将不同的数据类型,构造成为统⼀的数据类型,相当于将其放到了⼀个箱⼦⾥,实现了数据类型的统⼀。
(2)如果我们得到⼀个 QJsonValue 对象,如何判断内部封装的到底是什么类型的数据呢?
const的作用这时候就需要调⽤相关的判断函数了,具体如下:
// 是否是Json数组
bool isArray() const;
// 是否是Json对象
bool isObject() const;
// 是否是布尔类型
bool isBool() const;
// 是否是浮点类型(整形也是通过该函数判断)
bool isDouble() const;
// 是否是空值类型
bool isNull() const;
// 是否是字符串类型
bool isString() const;
// 是否是未定义类型(⽆法识别的类型)
bool isUndefined() const;
(3)通过判断函数得到对象内部数据的实际类型之后,如果有需求就可以再次将其转换为对应的基础数据类型。
对应的 API 函数如下:
// 转换为Json数组
QJsonArray toArray(const QJsonArray &defaultValue) const;
QJsonArray toArray() const;
// 转换为布尔类型
bool toBool(bool defaultValue =false) const;
// 转换为浮点类型
double toDouble(double defaultValue =0) const;
// 转换为整形
int toInt(int defaultValue =0) const;
// 转换为Json对象
QJsonObject toObject(const QJsonObject &defaultValue) const;
QJsonObject toObject() const;
// 转换为字符串类型
QString toString() const;
QString toString(const QString &defaultValue) const;
通过上述三种函数可以⽅便的将数据打包为QJsonValue类型,后利⽤is⽅法判定数据类型,最后利⽤to⽅法转换为原始数据。
3. QJsonObject
QJsonObject 封装了 Json 中的对象,在⾥边可以存储多个键值对,为了⽅便操作, 键值为字符串类型,值为QJsonValue 类型。
关于这个类的使⽤类似于 C++ 中的 STL 中的Map(Map中也是采⽤键值对的结构,K-V结构,但是它的⾥⾯键值可以指定类型),仔细阅读 API ⽂档即可熟练上⼿使⽤,下⾯介绍⼀些常⽤ API 函数:
(1)如何创建空的 Json 对象,⾥⾯不包含任何的键值对
QJsonObject::QJsonObject(); // 构造空对象
(2)将键值对添加到空对象中(key和value是成对出现组成元素的,排列顺序按照键值的⼤⼩升序排列)
iterator QJsonObject::insert(const QString &key, const QJsonValue &value);
(3)获取对象中键值对个数
int QJsonObject::count() const;
int QJsonObject::size() const;
int QJsonObject::length() const;
(4)通过 key 得到 value
//通过Key值去取值
QJsonValue QJsonObject::value(const QString &key) const; // utf8
QJsonValue QJsonObject::value(QLatin1String key) const; // 字符串不⽀持中⽂
//通过重载[]操作符只需要在[]中写⼊字符串类型的key值
QJsonValue QJsonObject::operator[](const QString &key) const;
QJsonValue QJsonObject::operator[](QLatin1String key) const;
(5)删除键值对,通过Key值去查,删除整个键值对
void QJsonObject::remove(const QString &key); //没有返回值
QJsonValue QJsonObject::take(const QString &key); // 返回key对应的value值
(6)通过 key 进⾏查
iterator QJsonObject::find(const QString &key); //得到的是迭代器类型的数据块,使⽤与指针类似
bool QJsonObject::contains(const QString &key) const; //返回是否存在
(7)遍历,⽅式有三种:
使⽤相关的迭代器函数
使⽤ [] 的⽅式遍历,类似于遍历数组,[] 中是键值
先得到对象中所有的键值,在遍历键值列表,通过 key 得到 value 值
QStringList QJsonObject::keys() const;
//(1)得到当前Json对象⾥所有的key值,返回key值字符串的集合
/
/(2)得到key值就可以对字符串数组进⾏遍历,依次取出Key
//(3)通过Key值取出value,再进⾏数据转换就可以得到原始数据
4. QJsonArray
QJsonArray 封装了 Json 中的数组,在⾥边可以存储多个元素,为了⽅便操作,所有的元素类统⼀为 QJsonValue 类型。
关于这个类的使⽤类似于 C++ 中的 STL 类,仔细阅读 API ⽂档即可熟练上⼿使⽤,下⾯介绍⼀些常⽤ API 函数: (1)创建空的 Json 数组
QJsonArray::QJsonArray();
(2)添加数据
void QJsonArray::append(const QJsonValue &value); // 在尾部追加
void QJsonArray::insert(int i, const QJsonValue &value); // 插⼊到 i 的位置之前
//放到迭代器对应位置的前边
iterator QJsonArray::insert(iterator before, const QJsonValue &value);
void QJsonArray::prepend(const QJsonValue &value); // 添加到数组头部
void QJsonArray::push_back(const QJsonValue &value); // 添加到尾部
void QJsonArray::push_front(const QJsonValue &value); // 添加到头部
(3)计算数组元素的个数
int QJsonArray::count() const;
int QJsonArray::size() const;
(4)从数组中取出某⼀个元素的值
QJsonValue QJsonArray::at(int i) const;
QJsonValue QJsonArray::first() const; // 头部元素
QJsonValue QJsonArray::last() const; // 尾部元素
QJsonValueRef QJsonArray::operator[](int i); //通过[]得到位置元素的引⽤
(5)从数组中取出某⼀个元素的值
QJsonValue QJsonArray::at(int i) const;
QJsonValue QJsonArray::first() const; // 头部元素
QJsonValue QJsonArray::last() const; // 尾部元素
QJsonValueRef QJsonArray::operator[](int i);
(6)删除数组中的某⼀个元素
iterator QJsonArray::erase(iterator it); // 基于迭代器删除
void QJsonArray::pop_back(); // 删除尾部
void QJsonArray::pop_front(); // 删除头部
void QJsonArray::removeAt(int i); // 删除i位置的元素
void QJsonArray::removeFirst(); // 删除头部
void QJsonArray::removeLast(); // 删除尾部
QJsonValue QJsonArray::takeAt(int i); // 删除i位置的原始, 并返回删除的元素的值
(7)Josn 数组的遍历,常⽤的⽅式有两种:
可以使⽤迭代器进⾏遍历(和使⽤迭代器遍历 STL 容器⼀样)
可以使⽤数组的⽅式遍历(for循环)
5. QJsonDocument
它封装了⼀个完整的 JSON ⽂档,并且可以从 UTF-8 编码的基于⽂本的表⽰以及 Qt ⾃⼰的⼆进制格式读取和写⼊该⽂档。 QJsonObject 和 QJsonArray 这两个对象中的数据是不能直接转换为字符串类型的,如果要进⾏数据传输或者数据的持久化,操作的都是字符串类型⽽不是 QJsonObject 或者 QJsonArray 类型, 我们需要通过⼀个 Json ⽂档类进⾏⼆者之间的转换。
下⾯依次介绍⼀下这两个转换流程应该如何操作:
(1) QJsonObject 或者 QJsonArray --> 字符串(序列化)
1)创建 QJsonDocument 对象
QJsonDocument::QJsonDocument(const QJsonObject &object);
QJsonDocument::QJsonDocument(const QJsonArray &array);
可以看出,通过构造函数就可以将实例化之后的 **QJsonObject 或者 QJsonArray ** 转换为 QJsonDocument 对象了。
2)将⽂件对象中的数据进⾏序列化
// ⼆进制格式的json字符串
QByteArray QJsonDocument::toBinaryData() const;
// ⽂本格式
QByteArray QJsonDocument::toJson(JsonFormat format= Indented) const;
通过调⽤ toxxx() ⽅法就可以得到⽂本格式或者⼆进制格式的 Json 字符串了
3)使⽤得到的字符串进⾏数据传输,或者磁盘⽂件持久化
(2) 字符串 -->QJsonObject 或者 QJsonArray
⼀般情况下,通过⽹络通信或者读磁盘⽂件就会得到⼀个 Json 格式的字符串,如果想要得到相关的原始数据就需要对字符串中的数据进⾏解析,具体解析流程如下:
1)将得到的 Json 格式字符串通过 QJsonDocument 类的静态函数转换为 QJsonDocument 类对象
[static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
// 参数⽂件格式的json字符串
[static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR);
2)将⽂档对象转换为 json 数组 / 对象
// 判断⽂档对象中存储的数据是不是数组
bool QJsonDocument::isArray() const;
// 判断⽂档对象中存储的数据是不是json对象
bool QJsonDocument::isObject() const
// ⽂档对象中的数据转换为json对象
QJsonObject QJsonDocument::object() const;
// ⽂档对象中的数据转换为json数组
QJsonArray QJsonDocument::array() const;
3)通过调⽤ QJsonArray , QJsonObject 类提供的 API 读出存储在对象中的数据。
关于 Qt 中 Json 数据对象以及字符串之间的转换的操作流程是固定的,我们在编码过程中只需要按照上述模板处理即可,相关的操作是没有太多的技术含量可⾔的。
声明: 本篇是在以下视频及链接基础上学习并稍微做了补充,感谢原博主!
学习视频地址:
学习笔记⽹址:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论