[转载]QT中获取天气预报json数据

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: [转载]QT中获取天气预报json数据

转载自:http://blog.csdn.net/wangtaohappy/article/details/8995266

接上篇 Qt中解析Json的总结http://blog.csdn.net/wangtaohappy/article/details/8964603

获取天气预报的API接口有好多,楼主用的是中国气象台weather.com.cn的接口,返回ison数据。

有三个接口:

http://m.weather.com.cn/data/101050101.html

http://www.weather.com.cn/data/sk/101010100.html

http://www.weather.com.cn/data/cityinfo/101010100.html

具体接口数据格式,可参照:http://blog.mynook.info/2012/08/18/weather-com-cn-api.html

问题来源:项目中QT主程序中先加载地图baiduMap.html,然后需要在地图上显示某区域的天气状况。

方案:1.QT主程序只加载baiduMap.html和传递参数,剩下的由html中的js函数访问天气预报接口。

              问题:此时,baiduMap.html中访问weather.com.cn ,会出现JS跨站访问的问题。

                    js跨站问题,客户端解决方案有:设置document.domain;通过script标签加载。

                    其他js跨站解决方案可参考:http://whj105504.blog.163.com/blog/static/27639795201273104610723/

                                                            http://blog.csdn.net/hitzhang/article/details/4790304

                           针对本问题,最好的解决方案是:通过script标签加载方式,但由于  weather.com.cn  的API接口返回数据是json数组,是没有定义变量名的,

                            而这样的  json数组在javascript是非法的,因此本方法也不能解决问题。          

          2.QT主程序访问天气接口,并利用QJson解析json数据,然后发送给baiduMap.html。

             问题:该方案需要利用外部库QJson,稍感冗余。适用于不与html和javaScript交互的QT程序,如:只在Qt程序里使用天气预报。

          3.QT主程序只访问天气接口但不做解析,将返回的json数据传给baiduMap.html,利用其JS函数直接解析。

         问题:本方案不用QJson,直接传给js,利用json的js原生特性,js中可以直接访问json数组,不用解析。

                    但weather.com.cn的返回json数据,在Qt中传递给js时,会遇到转义问题。需要对数据先进行转义处理。

                    参考:weatherData.replace("\"","\\\"");//将数据进行转义处理,"的转义符\"; \ 的转义符是\\   

 本例参考代码:

           QT主程序:

void MainWindow::on_pushButton_clicked()
{
    ui->m_MapWebView->load(QUrl("json.html"));//加载百度地图的html网页,网页中调用javascript

    QString cityID = "101050101";//
    GetWeatherJson(cityID);
}

void MainWindow::GetWeatherJson(QString cityid)
{
    //QUrl url(QString("http://m.weather.com.cn/data").append(cityid).append(".html"));
    QUrl url(QString("http://www.weather.com.cn/data/cityinfo/").append(cityid).append(".html"));
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
    QNetworkRequest request;
    request.setUrl(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
 /*   request.setHeader(QNetworkRequest::UserAgentHeader,
                      "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)");
 */
    manager->get(request);
}

void MainWindow::replyFinished(QNetworkReply* replay)
{
    if(replay->error() == QNetworkReply::NoError)
    {
        QByteArray data = replay->readAll();
        //ParseWeatherMessage(data);//该函数利用QJson解析天气信息
        QString weatherData = QString(data);
        qDebug()<<weatherData;

        weatherData.replace("\"","\\\"");//将数据进行转义处理," 的转义符\"; \ 的转义符是\\
        qDebug()<<weatherData;
        QString jsFunc = QString("insertHTML(\"%1\")").arg(weatherData);//以字符串形式传递消息要调用userAddMarker(经度,纬度)函数
        ui->m_MapWebView->page()->mainFrame()->evaluateJavaScript(jsFunc);//调用JS的userAddMarker(经度,纬度)函数
    }else qDebug()<<"get weather message ERROR";
}

json.html中的代码:

<script>
function insertHTML(data)//解析json数据
{  
   var jsonWeatherObj = eval('(' + data + ')'); 
   var city = jsonWeatherObj.weatherinfo.city;
   var temp1 = jsonWeatherObj.weatherinfo.temp1 ;
   var weather = jsonWeatherObj.weatherinfo.weather ;
   alert(city);   alert(temp1);   alert(weather);alert(data);
}

</script>

剩下的,就是从数据库中取得各个城市的cityID ,由Qt程序访问天气信息,然后传给html,并在html上显示出来!

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: [转载]QT中获取天气预报json数据

文章的脚注信息由WordPress的wp-posturl插件自动生成



|2|left
打赏

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: