在 Json 的两种格式中介绍了 Json 的格式以及应用场景。由于这种数据格式与语言无关,下面介绍一下 Json 在 Qt 中的使用。
从 Qt 5.0
开始提供了对 Json 的支持,我们可以直接使用 Qt 提供的 Json 类进行数据的组织和解析。相关的类常用的主要有四个,具体如下:
Json 类 | 介绍 |
---|
QJsonDocument | 它封装了一个完整的 JSON 文档,并且可以从 UTF-8 编码的基于文本的表示以及 Qt 自己的二进制格式读取和写入该文档。 |
QJsonArray | JSON 数组是一个值列表。可以通过从数组中插入和删除 QJsonValue 来操作该列表。 |
QJsonObject | JSON 对象是键值对的列表,其中键是唯一的字符串,值由 QJsonValue 表示。 |
QJsonValue | 该类封装了 JSON 支持的数据类型。 |
1. QJsonValue
在 Qt 中 QJsonValue
可以封装的基础数据类型有六种(和 Json 支持的类型一致),分别为:
- 布尔类型:
QJsonValue::Bool
- 浮点类型(包括整形):
QJsonValue::Double
- 字符串类型:
QJsonValue::String
- Json 数组类型:
QJsonValue::Array
- Json 对象类型:
QJsonValue::Object
- 空值类型:
QJsonValue::Null
这个类型可以通过 QJsonValue
的构造函数被封装为一个类对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| QJsonValue(const QJsonObject &o);
QJsonValue(const QJsonArray &a);
QJsonValue(const char *s); QJsonValue(QLatin1String s); QJsonValue(const QString &s);
QJsonValue(qint64 v); QJsonValue(int v); QJsonValue(double v);
QJsonValue(bool b);
QJsonValue(QJsonValue::Type type = Null);
|
如果我们得到一个 QJsonValue
对象,如何判断内部封装的到底是什么类型的数据呢?这时候就需要调用相关的判断函数了,具体如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| bool isArray() const;
bool isObject() const;
bool isBool() const;
bool isDouble() const;
bool isNull() const;
bool isString() const;
bool isUndefined() const;
|
通过判断函数得到对象内部数据的实际类型之后,如果有需求就可以再次将其转换为对应的基础数据类型,对应的 API 函数如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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;
QJsonObject toObject(const QJsonObject &defaultValue) const; QJsonObject toObject() const;
QString toString() const; QString toString(const QString &defaultValue) const;
|
一般情况下,对于 Json 字符串的解析函数都是有针对性的,因为需求不同设计的 Json 格式就会有所不同,所以不要试图写出一个通用的 Json 解析函数,这样只会使函数变得臃肿而且不易于维护,每个 Json 格式对应一个相应的解析函数即可。
上面的例子中为了给大家演示 Qt 中 Json 类相关 API 函数的使用将解析步骤写的复杂了,因为在解析的时候我们是知道 Json 对象中的所有 key 值的,可以直接通过 key 值将对应的 value 值取出来,因此上面程序中的一些判断和循环其实是可以省去的。