Qt 常用JSON解析示例


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;
        }
    }
}

參考:

Qt平台下使用QJson解析和構建JSON字符串

【Qt】Qt中QJsonObject類

JSON在線解析



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM