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

Qt 提供的与 JSON 相关的类,主要有四个:
QJsonObjectQJsonArrayQJsonValueQJsonDocument
下面依次介绍这几个类
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 本身的二进制格式读取和写入该文档。
QJsonObject 和 QJsonArray 这两个对象是不能直接转换为字符串类型的,需要通过 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 获取存储在其中的数据
这篇博客详细介绍了在Qt开发中,用于处理JSON数据的QJsonObject、QJsonArray、QJsonValue和QJsonDocument四个类。QJsonObject用于存储键值对,QJsonArray封装JSON数组,QJsonValue封装六种数据类型,而QJsonDocument则负责整个JSON文档的读写。内容包括各个类的基本操作,如添加、获取、删除元素,以及JSON数据与字符串之间的转换方法。
2898

被折叠的 条评论
为什么被折叠?



