JSON的解析要對照JSON字符串來理解,關於JSON字符串的介紹,可以參考JSON簡介
首先,解析和構建都要包含如下頭文件:
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
示例1:和風天氣實時數據
這個 JSON 字符串中 HeWeather6 鍵的值是一個數組,數組內只有 1 個 JSON 對象,這個對象里又嵌套了幾個 JSON 對象。
{
"HeWeather6": [{
"basic": {
"cid": "CN101010700",
"parent_city": "北京",
"cnty": "中國",
},
"status": "ok",
}]
}
主要是 JSON 的多層嵌套的解析。解析函數:
int Parse_HeWeather_Now_Json(void)
{
QJsonParseError err_rpt;
QJsonDocument root_Doc = QJsonDocument::fromJson(he_now_json, &err_rpt); // 字符串格式化為JSON
if(err_rpt.error != QJsonParseError::NoError)
{
qDebug() << "JSON格式錯誤";
return -1;
}
else // JSON格式正確
{
//qDebug() << "JSON格式正確:\n" << root_Doc;
QJsonObject root_Obj = root_Doc.object();
QJsonValue weather_Value = root_Obj.value("HeWeather6"); // HeWeather6鍵的值,是一個數組
if(weather_Value.isArray()) // 可省略
{
QJsonObject weather_Obj = weather_Value.toArray().at(0).toObject(); // HeWeather6數組就含有一個元素0
/* basic鍵信息 */
QJsonObject basic_Obj = weather_Obj.value("basic").toObject();
QString cid = basic_Obj.value("cid").toString();
QString parent_city = basic_Obj.value("parent_city").toString();
QString cnty = basic_Obj.value("cnty").toString();
QString basic_info = cid + " " + parent_city + " " + cnty;
qDebug() << basic_info;
QString status = "解析狀態:" + weather_Obj.value("status").toString(); //"ok"
qDebug() << status;
}
return 0;
}
示例2:心知天氣實時數據
這個字符串和上面那個一樣,都是數組元素是 JSON 對象,對象的值又是一個 JSON 對象。
{
"results": [{
"location": {
"id": "WX4FBXXFKE4F",
"name": "北京",
"country": "CN",
"path": "北京,北京,中國",
"timezone": "Asia/Shanghai",
"timezone_offset": "+08:00"
},
"now": {
"text": "晴",
"code": "1",
"temperature": "-7"
},
"last_update": "2018-12-06T22:05:00+08:00"
}]
}
解析函數:
int Parse_Seniverse_Now_Json(void)
{
QJsonParseError err_rpt;
QJsonDocument root_Doc = QJsonDocument::fromJson(seniverse_now_json, &err_rpt); // 字符串格式化為JSON
if(err_rpt.error != QJsonParseError::NoError)
{
qDebug() << "JSON格式錯誤";
return -1;
}
else // JSON格式正確
{
//qDebug() << "JSON格式正確:\n" << root_Doc;
QJsonObject root_Obj = root_Doc.object();
QJsonValue result_Value = root_Obj.value("results");
if(result_Value.isArray())
{
QJsonObject result_Obj = result_Value.toArray().at(0).toObject();
QString last_update = result_Obj.value("last_update").toString();
qDebug() << last_update;
/* location鍵的值 */
QJsonObject location_Obj = result_Obj.value("location").toObject();
QString id = location_Obj.value("id").toString();
QString name = location_Obj.value("name").toString();
QString timezone = location_Obj.value("timezone").toString();
QString path = location_Obj.value("path").toString();
QString loc_str = id + " " + name + " " + timezone + " " + path ;
qDebug() << loc_str;
/* now鍵 */
QJsonObject now_Obj = result_Obj.value("now").toObject();
QString code = "天氣代碼: " + now_Obj.value("code").toString();
QString temperature = "當前溫度:" + now_Obj.value("temperature").toString();
QString text = "天氣:" + now_Obj.value("text").toString();
qDebug() << code << temperature << text;
}
}
return 0;
}
示例3:獲取ID
JSON字符串為:
{
"data": {
"list":[
{"id":"20200602221529"},
{"id":"20200602203158"},
{"id":"20200602175752"}
],
"pagecnt":5,
"pageindex":2
},
"result":0,
"type":25
}
解析函數:
QJsonParseError parseJsonErr;
// 轉化為JSON文檔
QJsonDocument jsonDoc = QJsonDocument::fromJson(response.toUtf8(), &parseJsonErr);
// 解析未發生錯誤
if(parseJsonErr.error == QJsonParseError::NoError)
{
QJsonObject rootObj = jsonDoc.object(); // 轉化為root對象
QJsonValue rootValue = rootObj.value("data"); // 獲取指定key對應的value,
QJsonObject arrObject = rootValue.toObject(); // 再將值轉換為obj:上一級key對應的值實際為數組對象
QJsonValue arrValue = arrObject.value("list");
if(arrValue.isArray()) // 判斷獲取的QJsonValue對象是不是數組結構
{
QJsonArray array = arrValue.toArray();
for(int i=0;i<array.size();i++)
{
QJsonValue idValue = array.at(i);
QJsonObject idObject = idValue.toObject();
QString id = idObject["id"].toString();
qDebug() <<"id=" <<id;
}
}
}
參考: