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"
