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在线解析

原文链接: https://www.cnblogs.com/linuxAndMcu/p/13040194.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    Qt 常用JSON解析示例

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/352633

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午7:38
下一篇 2023年3月2日 上午7:39

相关推荐