转载自: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上显示出来!
文章的脚注信息由WordPress的wp-posturl插件自动生成