头文件

Qt帮我们包装好了JSON类,QJson

会使用到的头文件如下:

1
2
3
4
5
#include <QJsonDocument>
#include <QJsonValue>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonParseError>

使用案例

以下这段原始的JSON数据为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[
{
"id": 1,
"pid": 0,
"city_code": "101010100",
"city_name": "北京",
"post_code": "100000",
"area_code": "010",
"ctime": ""
},
{
"id": 2,
"pid": 0,
"city_code": "101020100",
"city_name": "上海",
"post_code": "200000",
"area_code": "021",
"ctime": ""
},
{
"id": 3,
"pid": 0,
"city_code": "101030100",
"city_name": "天津",
"post_code": "300000",
"area_code": "022",
"ctime": ""
}
]

先读取JSON数据转为QJsonDocument文档对象

首先使用QJsonDocument读取原始JSON数据

1
2
QJsonParseError err;
QJsonDocument jsonDoc = QJsonDocument::fromJson(json, &err);

这个方法会先将整个JSON数据包装成QJsonDocument对象

值得注意的是:在JSON语法中,整个JSON数据是一个值,值可以是很多类型,比如:数组、对象、字符串、数字、布尔值以及null。也就是说一个JSON数据可以单单是一个数字或者布尔值。

1
1
1
true

上面两个都是合法的。

然后我们根据实际的情况调用方法将其转为JSON数组或者JSON对象。

如果是数组类型就转为数组QArray,如果是对象类型就转为对象QObject

1
2
3
4
QJsonParseError err;
QJsonDocument jsonDoc = QJsonDocument::fromJson(json, &err);

QJsonArray cities = jsonDoc.array();

然后使用QJsonValue

前面说过,JSON的本质是一个,这值可以是很多类型。JSON数据本身是一个值,JSON对象类型里的键值对中的键,是严格用双引号表示的字符串,值就是前面说的值可以是很对类型。

由于值可以是很多类型,所以Qt用统一的QJsonValue来表示JSON中的值。

然后用户根据实际的情况将其转化为其它类型

00

如果实际是数组,就转为JSON数组;如果实际是对象,就转为JSON对象。如果实际是字符串,就转为字符串

1
2
3
4
5
6
7
QJsonParseError err;
QJsonDocument jsonDoc = QJsonDocument::fromJson(json, &err);

QJsonArray cities = jsonDoc.array();
for (const QJsonValue& jValue : cities) {
QJsonObject city = jValue.toObject();
}

==可以说整个 QJson 就是以 QJsonValue 为重心。==

获取QObject中的键相应的值

直接使用QJsonValue value(const QString &key) const方法获取键的值。

注意到返回值还是一个QJsonValue,前面说过对象的键值对中的值同样是一个JSON的值,它可以是很多类型。

我们要根据实际情况把QJsonValue转为我们需要的类型。比如实际的值是字符串类型就要使用QJsonValue.toString()

1
2
3
4
5
6
7
8
9
10
11
12
QJsonParseError err;
QJsonDocument jsonDoc = QJsonDocument::fromJson(json, &err);

QJsonArray cities = jsonDoc.array();
for (const QJsonValue& jValue : cities) {
QJsonObject city = jValue.toObject();

QString city_code = city.value("city_code").toString();
QString city_name = city.value("city_name").toString();
if (!city_code.isEmpty())
m_CityNameToCode.insert(std::pair<QString, QString>(city_name, city_code));
}