Qt 解析Json数据显示天气信息

原创
2022-11-28
4671
3

日丽天气使用的天气API为和风天气的免费天气API,和风天气API说明主页为https://www.heweather.com/documents。
关于天气系统的完整说明详见:Qt实战小工具 – 日丽天气V1.0
本天气系统中使用的API如下(parameters为需要填的参数信息):
3-10天天气预报:https://free-api.heweather.com/s6/weather/forecast?parameters
实况天气:https://free-api.heweather.com/s6/weather/now?parameters
生活指数:https://free-api.heweather.com/s6/weather/lifestyle?parameters
空气质量实况:https://free-api.heweather.com/s6/air/now?parameters

解析json文件部分的关键代码如下:

void WeatherInterface::disposeWeatherJsonData(QString jsonData)
{
    QJsonParseError jsonError;
    QByteArray byteArray = jsonData.toUtf8();
    QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError);  // 转化为 JSON 文档
    if (doucment.isNull() || jsonError.error != QJsonParseError::NoError)
        return;

    // 获取JsonObject
    QJsonArray mainDataJsonArray;
    if (doucment.isObject())
    {
        QJsonObject jsonObject = doucment.object();
        if (jsonObject.contains("HeWeather6"))
        {
            QJsonValue jsonValue = jsonObject.value("HeWeather6");
            if (jsonValue.isArray())
                mainDataJsonArray = jsonValue.toArray();
            else
                return;
        }
    }

    QJsonObject mainDataJsonObject = mainDataJsonArray.at(0).toObject();

    // 解释Basic
    if (mainDataJsonObject.contains("basic"))
    {
        QJsonObject basicJsonObject = mainDataJsonObject.value("basic").toObject();
        m_WeatherBaseData.cid = basicJsonObject.value("cid").toString();
        m_WeatherBaseData.location = basicJsonObject.value("location").toString();
        m_WeatherBaseData.parent_city = basicJsonObject.value("parent_city").toString();
        m_WeatherBaseData.admin_area = basicJsonObject.value("admin_area").toString();
        m_WeatherBaseData.cnty = basicJsonObject.value("cnty").toString();
        m_WeatherBaseData.lat = basicJsonObject.value("lat").toString().toDouble();
        m_WeatherBaseData.lon = basicJsonObject.value("lon").toString().toDouble();
        m_WeatherBaseData.tz = basicJsonObject.value("tz").toString().toDouble();
    }

    // 解析更新时间
    if (mainDataJsonObject.contains("update"))
    {
        QJsonObject updateJsonObject = mainDataJsonObject.value("update").toObject();
        m_WeatherTime.localTime = QDateTime::fromString(updateJsonObject.value("loc").toString(), "yyyy-MM-dd hh:mm");
        m_WeatherTime.utcTime = QDateTime::fromString(updateJsonObject.value("utc").toString(), "yyyy-MM-dd hh:mm");
    }

    // 解析状态码
    if (mainDataJsonObject.contains("status"))
    {
        m_WeatherStatus.statusCode = mainDataJsonObject.value("status").toString();
        m_WeatherStatus.note = getStatusCodeNote(m_WeatherStatus.statusCode);
    }

    // 解析类型的信息
    m_TypeInterfaceMap[m_WeatherGetType]->disposeWeatherInfo(mainDataJsonObject);
}
  • QJsonDocument::fromJson函数可以以字符串的方式传入Josn,QJsonParseError 可以判断Josn串是否出错。
  • doucment.isObject() 可以判断是否为对象的形式,jsonValue.isArray()判断是否为数组的形式。
  • jsonObject.value(“HeWeather6”), 为获取HeWeather6对应的值。

m_TypeInterfaceMap[m_WeatherGetType]->disposeWeatherInfo(mainDataJsonObject);为处理除公共部分外的Json信息。

完整代码下载:https://github.com/douzhongqiang/WeatherSystem.git

不会飞的纸飞机
扫一扫二维码,了解我的更多动态。

下一篇文章:Qt实战小工具 -- 日丽天气V1.0