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

日丽天气使用的天气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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt界面通过网络获取天气信息的过程,一般可以分为以下几个步骤: 第一步,创建请求对象。使用Qt提供的QNetworkRequest类创建一个请求对象,设置请求的URL地址以及请求的Header信息。 第二步,发送请求。使用Qt的QNetworkAccessManager类发送上述请求对象,调用其get()函数即可发送请求。 第三步,接收相应。Qt的QNetworkAccessManager类会自动接收到服务器的相应信息,可以通过其finished()信号捕捉到这个事件,回调函数中则可以读取响应的信息。 第四步,解析数据。一般天气信息返回的是Json格式数据,我们需要使用QtJson解析Qt Json解析数据,将其转换成相应的数据结构,例如用QJsonObject表示城市名、温度、天气状况等信息。 第五步,更新UI。将第四步中解析得到的数据结构,通过Qt界面的QLabel、QTextBrowser等控件,动态地更新显示在界面上。 需要注意在整个网络获取天气信息的过程中,需要添加相应的错误处理,例如网络连接失败、天气数据解析出错等等情况,以保证界面能够及时地响应用户的操作。 ### 回答2: Qt界面是一种基于C++的图形用户界面开发框架。这种框架可以帮助开发者创建出漂亮、易于使用、跨平台的应用程序界面。Qt界面中内置了许多通信和网络相关的类库,使得开发者可以很方便地利用网络进行数据的获取和传输。 获取天气信息通常需要连接到一个天气服务的API,通过发送HTTP请求来获取数据,再将数据解析回传给应用程序进行处理。在Qt界面中,可以使用QNetworkAccessManager等相关类库来实现这个过程。具体而言,可以通过下列步骤来实现: 1. 创建一个QNetworkAccessManager对象,该对象可以用于发送HTTP请求和接收响应数据。 2. 构造HTTP请求对象。对于获取天气信息,通常需要指定一个特定的URL,以及HTTP请求头部的一些参数,例如浏览器类型、语言等。 3. 发送HTTP请求,并等待响应。当响应数据到达时,QNetworkAccessManager对象会发出相应的信号,用于通知应用程序已经得到响应数据。 4. 按照天气API返回的格式,解析响应数据,并提取所需要的信息。这部分工作需要根据具体API的规定进行实现。 5. 将解析获得的天气信息显示Qt界面上。这一过程中,可以利用Qt的控件和布局等功能,将获取到的信息以适当的方式进行展示。 综上所述,Qt界面通过网络获取天气信息可以利用QNetworkAccessManager等类库,通过发送HTTP请求、解析响应数据实现。这种方法具有可靠性高、代码清晰等优点,可以满足大多数天气API的调用需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值