QT中使用json还是比较方便的,下面用例子直接说明
之后根据这个格式进行json数据解析。
QT使用json需要包含的头文件
1 #include<qjsondocument.h>
2 #include<qjsonarray.h>
3 #include<qjsonobject.h>
4 #include<qjsonvalue.h>
先看一段简单的生成QJSON数据的方法吧:
1 //简单的QTJson数据
2 QJsonObject simp_ayjson;
3 simp_ayjson.insert("name", "LLH");
4 simp_ayjson.insert("age", 20);
5 simp_ayjson.insert("myAccounts", QString::fromLocal8Bit("123你好"));
6 QJsonDocument document;
7 document.setObject(simp_ayjson);
8 QByteArray simpbyte_array = document.toJson(QJsonDocument::Compact);
9 QString simpjson_str(simpbyte_array);
10 qDebug() << QString::fromLocal8Bit("简单的QTJson数据:") << simpjson_str;
输出结果:
"简单的QTJson数据:" "{\"age\":20,\"myAccounts\":\"123你好\",\"name\":\"LLH\"}"
解析方法是:
1 //简单的QT解析JSON
2 QJsonParseError simp_json_error;
3 QString name, myAccount;
4 int age;
5 //QTJSON所有的元素
6 QJsonDocument simp_parse_doucment = QJsonDocument::fromJson(simpjson_str.toUtf8(), &simp_json_error);
7 //检查json是否有错误
8 if (simp_json_error.error == QJsonParseError::NoError)
9 {
10 if (simp_parse_doucment.isObject())
11 {
12 //开始解析json对象
13 QJsonObject obj = simp_parse_doucment.object();
14 //如果包含name
15 if (obj.contains("name"))
16 {
17 //的到name
18 QJsonValue name_value = obj.take("name");
19 if (name_value.isString())
20 {
21 //转换name
22 name = name_value.toVariant().toString();
23 }
24 }
25 if (obj.contains("myAccounts"))
26 {
27 QJsonValue myAccount_value = obj.take("myAccounts");
28 if (myAccount_value.isString())
29 {
30 myAccount = myAccount_value.toString();
31 }
32 }
33 if (obj.contains("age"))
34 {
35 QJsonValue age_value = obj.take("age");
36 if (age_value.isDouble())
37 {
38 age = age_value.toVariant().toInt();
39 }
40 }
41 }
42 }
43 qDebug() << QString::fromLocal8Bit("简单的QT解析出来的数据:") << name << "," << age << "," << myAccount;
解析结果:
"简单的QT解析出来的数据:" "LLH" , 20 , "123你好"
其实这种json能满足一般的要求但是有些特殊数据要求json里面带有json数组就需要复杂一点的json了,来吧让我们继续。
复杂的json生成代码:
1 //复杂的QTJson数据
2 QJsonArray arrays;
3 for (int i = 0; i < 5;i++)
4 {
5 arrays.insert(i, QString::fromLocal8Bit("你好:%1").arg(i));
6 }
7 QJsonObject complex_json;
8 complex_json.insert("name", "LLHlllll");
9 complex_json.insert("age", 201);
10 complex_json.insert("myAccounts", QString::fromLocal8Bit("123你好llll"));
11 complex_json.insert("arrays", arrays);
12 QJsonDocument complex_document;
13 complex_document.setObject(complex_json);
14 QByteArray complex_byte_array = complex_document.toJson(QJsonDocument::Compact);
15 QString complex_json_str(complex_byte_array);
16 qDebug() <<"\n"<< QString::fromLocal8Bit("复杂的QTJson数据:") << complex_json_str;
输出结果:
"复杂的QTJson数据:" "{\"age\":201,\"arrays\":[\"你好:0\",\"你好:1\",\"你好:2\",\"你好:3\",\"你好:4\"],\"myAccounts\":\"123你好llll\",\"name\":\"LLHlllll\"}"
那么让我们来看看复杂的json如何解析吧:
1 //复杂的QT数据解析
2 QJsonParseError complex_json_error;
3 QJsonDocument complex_parse_doucment = QJsonDocument::fromJson(complex_json_str.toUtf8(), &complex_json_error);
4 if (complex_json_error.error == QJsonParseError::NoError)
5 {
6 if (complex_parse_doucment.isObject())
7 {
8 //开始解析json对象
9 QJsonObject jsonObject = complex_parse_doucment.object();
10 if (jsonObject.contains("name"))
11 {
12 QJsonValue groupName_value = jsonObject.take("name");
13 if (groupName_value.isString())
14 {
15 name = groupName_value.toString();
16 }
17 }
18 if (jsonObject.contains("myAccounts"))
19 {
20 QJsonValue myAccount_value = jsonObject.take("myAccounts");
21 if (myAccount_value.isString())
22 {
23 myAccount = myAccount_value.toVariant().toString();;
24 }
25 }
26 if (jsonObject.contains("age"))
27 {
28 QJsonValue groupIndex_value = jsonObject.take("age");
29 if (groupIndex_value.isDouble())
30 {
31 age = groupIndex_value.toVariant().toInt();;
32 }
33 }
34 if (jsonObject.contains("arrays"))
35 {
36 QJsonValue arrays_value = jsonObject.take("arrays");
37 if (arrays_value.isArray())//判断他是不是json数组
38 {
39 QJsonArray heeloArray = arrays_value.toArray();;
40 for (int i = 0; i < heeloArray.size(); i++){
41 QJsonValue helloArrayValue = heeloArray.at(i);
42 if (helloArrayValue.isString())
43 {
44 qDebug() <<"\n"<< QString::fromLocal8Bit("输出复杂的json:") << helloArrayValue.toString();
45 }
46 }
47 }
48 }
49 }
50 }
可以看到复杂的json解析代码有点长,原因可能是QT喜欢w3c就是docment元素的解析风格,也就是docment树解析,把数据加载成一颗树,然后在进行解析,好处是速度快,缺点是需要大量内存,代码虽然长点但是好理解,因为每一步都他的解析方式。
解析结果:
1 "输出复杂的json:" "你好:0"
2
3 "输出复杂的json:" "你好:1"
4
5 "输出复杂的json:" "你好:2"
6
7 "输出复杂的json:" "你好:3"
8
9 "输出复杂的json:" "你好:4"