【QT开发专题-天气预报】5. Qt 中 JSON 相关的类

这篇博客详细介绍了在Qt开发中,用于处理JSON数据的QJsonObject、QJsonArray、QJsonValue和QJsonDocument四个类。QJsonObject用于存储键值对,QJsonArray封装JSON数组,QJsonValue封装六种数据类型,而QJsonDocument则负责整个JSON文档的读写。内容包括各个类的基本操作,如添加、获取、删除元素,以及JSON数据与字符串之间的转换方法。

实现的 http 天气预报,整体效果如下:

整体效果



Qt 提供的与 JSON 相关的类,主要有四个:

  • QJsonObject
  • QJsonArray
  • QJsonValue
  • QJsonDocument

下面依次介绍这几个类


1. QJsonObject

QJsonObject 封装了 JSON 中的对象,可以存储多个键值对。

其中,键为字符串类型,值为 QJsonValue 类型。

  • 创建一个 QJsonObject 对象
QJsonObject::QJsonObject();
  • 将键值对添加到 QJsonObject 对象中
QJsonObject::iterator insert(const QString &key, const QJsonValue &value)
  • 获取 QJsonObject 对象中键值对的个数
int QJsonObject::count() const;
int QJsonObject::size() const;
int QJsonObject::length() const;
  • 通过 key 得到 value
QJsonValue QJsonObject::value(const QString &key) const;
QJsonValue QJsonObject::operator[](const QString &key) const;
  • 检查 key 是否存在
iterator QJsonObject::find(const QString &key);
bool QJsonObject::contains(const QString &key) const;
  • 遍历 key
QStringList QJsonObject::keys() const;

2. QJsonArray

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

  • 创建一个 QJsonArray
QJsonArray::QJsonArray();
  • 添加数组元素
// 添加到头部和尾部
void QJsonArray::append(const QJsonValue &value);
void QJsonArray::prepend(const QJsonValue &value);

// 插入到 i 的位置之前
void QJsonArray::insert(int i, const QJsonValue &value); 

// 添加到头部和尾部
void QJsonArray::push_back(const QJsonValue &value);
void QJsonArray::push_front(const QJsonValue &value);
  • 获取 QJsonArray 中元素个数
int QJsonArray::count() const;
int QJsonArray::size() const;
  • 获取元素的值
// 获取头部和尾部
QJsonValue QJsonArray::first() const;
QJsonValue QJsonArray::last() const;

// 获取指定位置
QJsonValue QJsonArray::at(int i) const;
QJsonValueRef QJsonArray::operator[](int i);
  • 删除元素
// 删除头部和尾部
void QJsonArray::pop_back();
void QJsonArray::pop_front();

void QJsonArray::removeFirst();
void QJsonArray::removeLast();

// 删除指定位置
void QJsonArray::removeAt(int i);
QJsonValue QJsonArray::takeAt(int i);

3. QJsonValue

它封装了 JSON 支持的六种数据类型,分别为:

# 布尔类型
QJsonValue::Bool

# 浮点类型(包括整形)
QJsonValue::Double

# 字符串类型
QJsonValue::String

# Json数组类型
QJsonValue::Array

# Json对象类型
QJsonValue::Object

# 空值类型
QJsonValue::Null

可以通过以下方式构造 QJsonValue 对象

// 字符串
QJsonValue(const char *s);
QJsonValue(QLatin1String s);
QJsonValue(const QString &s);

// 整形 and 浮点型
QJsonValue(qint64 v);
QJsonValue(int v);
QJsonValue(double v);

// 布尔类型
QJsonValue(bool b);

// Json对象
QJsonValue(const QJsonObject &o);

// Json数组
QJsonValue(const QJsonArray &a);

// 空值类型
QJsonValue(QJsonValue::Type type = Null);

如果已经得到了一个 QJsonValue 对象,如何判断其内部封装的是什么类型的数据呢?

答:使用以下判断函数

// 是否是字符串类型
bool isString() const;

// 是否是浮点类型(整形也是通过该函数判断)
bool isDouble() const;

// 是否是布尔类型
bool isBool() const;

// 是否是Json对象
bool isObject() const;

// 是否是Json数组
bool isArray() const;

// 是否是未定义类型(无法识别的类型)
bool isUndefined() const;

// 是否是空值类型
bool isNull() const;

通过以上判断函数,获取到其内部数据的实际类型之后,如果有需求就可以再次将其转换为对应的基础数据类型,对应的 API 函数如下:

// 转换为字符串类型
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;

// 转换为Json对象
QJsonObject toObject(const QJsonObject &defaultValue) const;
QJsonObject toObject() const;

// 转换为Json数组
QJsonArray toArray(const QJsonArray &defaultValue) const;
QJsonArray toArray() const;

4. QJsonDocument

它封装了一个完整的 JSON 文档。

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

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

下面介绍转换的步骤:

  • QJsonObject / QJsonArray => 字符串
// 1. 创建 QJsonDocument 对象
// 以 QJsonObject 或者 QJsonArray 为参数来创建 QJsonDocument 对象
QJsonDocument::QJsonDocument(const QJsonObject &object);
QJsonDocument::QJsonDocument(const QJsonArray &array);

// 2. 将 QJsonDocument 对象中的数据进行序列化
// 通过调用 toXXX() 方法就可以得到文本格式或者二进制格式的 Json 字符串了。
QByteArray QJsonDocument::toBinaryData() const;	                         // 二进制格式的json字符串
QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const;	 // 文本格式

// 3. 使用得到的字符串进行数据传输,或者保存到文件
  • 字符串 => QJsonObject / QJsonArray

通常,通过网络接收或者读取磁盘文件,会得到一个 JSON 格式的字符串,之后可以按照如下步骤,解析出 JSON 字符串中的一个个字段

// 1. 将 JSON 字符串转换为 QJsonDocument 对象
[static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
[static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR);

// 2. 将文档对象转换为 json 数组 / 对象

// 2.1 判断文档对象中存储的数据,是 JSON 数组还是 JSON 对象
bool QJsonDocument::isArray() const;
bool QJsonDocument::isObject() const
    
// 2.2 之后,就可以转换为 JSON 数组或 JSON 对象
QJsonObject QJsonDocument::object() const;
QJsonArray QJsonDocument::array() const;

// 3. 调用 QJsonArray / QJsonObject 类提供的 API 获取存储在其中的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大轮明王讲QT

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值