zoukankan      html  css  js  c++  java
  • 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格式正确:
    " << 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格式正确:
    " << 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在线解析


  • 相关阅读:
    本博客主题的相关配置(2021年)
    vscode侧边栏隐藏不需要的文件
    虎扑,豆瓣等用css屏蔽广告代码
    代替pandownload的百度网盘下载软件
    网络请求的超时原因
    OkHttp3系列(三)okhttp3-fast-spring-boot-starter
    OkHttp3系列(二)MockWebServer使用
    OkHttp3系列(一)初识OkHttp3
    为什么要使用短链接
    Google Guava之简化异常和错误的传播与检查
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/13040194.html
Copyright © 2011-2022 走看看