Qt处理Json文件

本文将针对使用Qt处理Json文件的过程进行讲解。

Json介绍

Json是一种轻量化的数据交换格式,使用非常方便,采用键值对的方式进行数据保存及索引。同时,Json支持多级嵌套格式,一个Json文件下,可以包含多个子Json内容。一个典型的Json文件格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
{ 
/*JSON 块1*/
"appDesc": {
"description": "SomeDescription",
"message": "SomeMessage"
},
/*JSON 块2*/
"appName": {
"description": "Home",
"message": "Welcome",
"imp":["awesome","best","good"]
}
}

使用Qt读取Json文件的步骤

关键类

在Qt中,提供了一些处理Json文件的类,本节列举一些重要的类对其作用和使用方法进行总结。

QJsonDocument

这个类的作用是将一个Utf8类型的字符串转换为一个Json Document对象,其使用方法如下:

1
2
3
QString val = file.readAll();
file.close();
QJsonDocument d = QJsonDocument::fromJson(val.toUtf8());

QJsonObject

该类是最关键的一个json类,能够获得一个json对象,通过键即可返回相应的值。

1
2
QJsonDocument d = QJsonDocument::fromJson(val.toUtf8());
QJsonObject sett2 = d.object(); //将json document 转换为json object

QJsonValue

保存解析json对象得到的值,类型根据值的类型确定。

1
QJsonValue value = sett2.value(QString("appName"));  //获得"appName"键对应的值

QJsonArray

获得一系列的json值组成的array,在很多情况下,json键值对保存的不是单一的值,而是若干值组成的列表,通过QJsonArray我们就能得到一个由QJsonValue组成的array,然后可以和vector、string等进行转换,从而完成矩阵或向量数据的导入及处理。

1
QJsonArray test = item["imp"].toArray();

获得所有键值

有些情况下我们需要遍历所有的键值,便利过程的代码如下:

1
2
3
4
5
QJsonObject json = doc.object();
foreach(const QString& key, json.keys()) {
QJsonValue value = json.value(key);
qDebug() << "Key = " << key << ", Value = " << value.toString();
}

完整代码

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
30
31
32
33
34
35
36
37
38
39
40
/* test.json */
{
"appDesc": {
"description": "SomeDescription",
"message": "SomeMessage"
},
"appName": {
"description": "Home",
"message": "Welcome",
"imp":["awesome","best","good"]
}
}


void readJson()
{
// 读取文件内容
QString val;
QFile file;
file.setFileName("test.json");
file.open(QIODevice::ReadOnly | QIODevice::Text);
val = file.readAll();
file.close();

QJsonDocument d = QJsonDocument::fromJson(val.toUtf8());
QJsonObject sett2 = d.object();
QJsonValue value = sett2.value(QString("appName"));

QJsonObject item = value.toObject();

/* in case of string value get value and convert into string*/
qWarning() << tr("QJsonObject[appName] of description: ") << item["description"];
QJsonValue subobj = item["description"];
qWarning() << subobj.toString();

/* in case of array get array and convert into string*/
qWarning() << tr("QJsonObject[appName] of value: ") << item["imp"];
QJsonArray test = item["imp"].toArray();
qWarning() << test[1].toString();
}

参考文献

0%