熊傳玉,徐尤華
?
Android系統下基于JSON的天氣預報應用的實現
熊傳玉,徐尤華
摘 要:在眾多基于Android平臺的天氣預報的APP中,目前多采用XML來進行數據交換,圖片等各項素材都需要從服務提供商的網站上下載,這樣會占用較多流量,并且開發難度也較大。采用JSON數據替代XML數據來進行數據交換,將運行程序所需一些資源文件放置于應用之中,運行時只需下載核心數據,這樣有效地降低了訪問流量,并且提高了處理速度。關鍵詞:Android;XML;JSON;天氣預報;app
目前,利用手機app獲取天氣預報信息正在成為主流的天氣信息獲取方式。所以越來越多的開發人員致力于開發簡單、美觀且實用的手機天氣預報app。但是大多數已經開發出來的手機天氣預報app都是通過XML來進行數據交換,手機app發出請求,服務器以XML的形式封裝好相應數據后返回給app[1-2]。
由于XML文件格式復雜,所以在傳輸過程中占較多的帶寬??蛻舳瞬煌瑸g覽器之間解析XML的方式不一致,也導致開發人員需要重復編寫很多代碼,使得服務器端和客戶端代碼變得異常復雜且不易維護,服務器端和客戶端都需要花費大量資源和時間來解析XML,致使網絡成本增加。
JSON數據的出現,很好地解決了這些問題。JSON數據格式比較簡單,易于讀寫,占用帶寬小,服務器端和客戶端的解析較為方便,大大簡化了服務器端和客戶端的代碼開發量, 使得系統易于維護。采用JSON格式進行數據交換。這種設計模式大大減少了傳輸的數據量,降低了數據解析難度,實現瀏覽器的兼容性和響應的快速性,提高了app的效率[3-5]。
Android是基于Linux操作系統的一款開源操作系統,在智能手機和平板電腦等移動設備上有著廣泛的使用。Android操作系統由谷歌和開放手機聯盟領導及開發,2007年11月谷歌與多家硬件制造商、軟件開發商及電信運營商組建開放手機聯盟共同研發改良Android系統[6]。
2011年Android在第一季度全球市場份額超越塞班系統,居全球第一。2013年第四季度,全球市場份額達78.1%。2014年第一季度Android平臺已占所有移動廣告流量來源的42.8%[7]。
天氣預報所需數據要從天氣預報服務提供商網站上獲取,獲取這些資源分為收費和免費兩種,文中相關資源及數據通過中國天氣網免費接口獲取。
2.1 天氣信息
中國天氣網提供了兩大免費接口供開發者使用,獲取時要提供所在城市的ID號,如果不知道ID號可以訪問如下接口:http://61.4.185.48:81/g/。以下為韶關市內訪問后獲取到的數據(101280201即為韶關市ID):
Var ip="61.146.193.118";
Var id=101280201;
if(typeof(id_callback)!="undefined")
{id_callback();}
要獲取實況數據,可以訪問接口http://www.weather.com.cn/data/sk/城市id.html(韶關:http://www.weather.com.cn/data/sk/101280201.html)。通過該接口可以獲取到天氣實況信息,但數據內容較少,以下為韶關市當前天氣實況數據:
{“weatherinfo”:{“city”:“韶關”,“cityid”:“101280201”,“temp”:“23”,“WD”:“南風”,“WS”:“3 級”,“SD”:“78%”,“WSE”:“3”,“time”:“10:30”,“isRadar”:“1”,“Radar”:“JC_RADAR_AZ9751_JB”,“njd”:“暫無實況”,“qy”:“998”}}
要獲取到更為詳細的信息,可以訪問接口http://m.weather.com.cn/atad/101280201.html。通過該接口獲取到的數據非常全面,可以解析出查詢日期開始6天內的數據,能夠很好的滿足應用開發需求,以下為韶關市6天內天氣詳細數據:
{“weatherinfo”:{“city”:“韶關”,“city_en”:“shaoguan”,“date_y”:“2015年4月9日”,“date”:“”,“week”:“星期四”,“fchh”:“11”,“cityid”:“101280201”,“temp1”:“14℃~10℃”,“temp2”:“13℃~10℃”?!皌emp3”:“13℃~10℃”,“temp4”:“20℃~11℃”。“temp5”:“22℃~12℃”,“temp6”:“24℃~11℃”,“tempF1”:“57.2℉~50℉”,“tempF2”:“55.4℉~50℉”,“tempF3”:“55.4℉~50℉”,“tempF4”:“68℉~51.8℉”,“tempF5”:“71.6℉~53.6℉”,“tempF6”:“75.2℉~51.8℉”,“weather1”:“小雨”,“weather2”:“小到中雨”,“weather3”:“中雨”,“weather4”:“多云轉晴”,“weather5”:“晴”,“weather6”:“晴轉多云”,“img1”:“7”,“img2”:“99”,“img3”:“21”,“img4”:“99”,“img5”:“8”,“img6”:“99”,“img7”:“1”,“img8”:“0”,“img9”:“0”,“mg10”:“99”,“img11”:“0”,“img12”:“1”,“img_single”:“7”,“img_title1”:“小雨”,“img_title2”:“小雨”,“img_title3”:“小到中雨”,“img_title4”:“小到中雨”,“img_title5”:“中雨”,“img_title6”:“中雨”,“img_title7”:“多云”,“img_title8”:“晴”,“img_title9”:“晴”,“img_title10”:“晴”,“img_title11”:“晴”,“img_title12”:“多云”,“img_title_single”:“小雨”,“wind1”:“微風”,“wind2”:“微風”,“wind3”:“微風”,“wind4”:“微風”,“wind5”:“微風”,“wind6”:“微風”,“fx1”:“微風”,“fx2”:“微風”,“fl1”:“小于3級”,“fl2”:“小于3級”,“fl3”:“小于3級”,“fl4”:“小于3級”,“fl5”:“小于3級”,“fl6”:“小于3級”,“index”:“較冷”,“index_d”:“建議著厚外套加毛衣等服裝。年老體弱者宜著大衣、呢外套加羊毛衫。”,“index48_uv”:“”,“index_xc”:“不宜”,“index_tr”:“適宜”,“index_co”:“舒適”,“st1”:“12”,“st2”:“8”,“st3”:“11”,“st4”:“8”,“st5”:“11”,“st6”:“8”,“index_cl”:“較不宜”,“index_ls”:“不宜”,“index_ag”:“不易發”}}
中國天氣網會分時段更新天氣預報數據,詳細數據在早晨8點,中午11點,下午18點都會有更新,為了節省流量,將數據以共享優先數據的形式存儲到應用之中,當用戶在某個時段反復查看天氣情況時只在第一次下載數據,其他時間直接從共享優先數據中讀取。
2.2 圖片資源
應用中所需圖標可以自己繪制,也可以從網絡上獲取。中國天氣網預報天氣時各種圖標通過如下地址獲得:http://www.weather.com.cn/static/html/legend.shtml,部分白天天氣圖標如圖1所示:

圖1 白天天氣圖標示例
為了節省流量,將這些圖標統一下載下來(共81K),開發時放入到應用之中,需要圖片時從應用之中獲取,能夠避免反復下載這些圖片。
2.3 城市ID
如果應用要做到能查詢所有城市的天氣情況,每次都通過相應接口獲取城市ID號就會很麻煩,因此將所有城市ID號獲得后(網上能得到JSON版城市ID數據),存入到android內置的SQLite數據庫中。數據庫創建完成后,作為資源文件存放在應用的assets文件夾中。保存好后的數據庫部分截圖,給出了省會與城市的對應關系,以及城市的ID號,如圖2所示:

圖2 城市ID與省會對應關系數據庫截圖
3.1 解析方式分析
XML和JSON是目前流行的兩種數據交換格式。
XML允許使用自定義格式來標記、交換和處理數據,有助于在服務器之間傳輸結構化數據,在實際應用中通常會使用DOM API處理XML數據,DOM在不同的瀏覽器中實現的方式會有一些差異,增加了編程難度,XML中使用了很多起始/結束標記來標記特定數據,提高了數據的可讀性,但降低了數據的解析速度與傳輸效率[8]。
JSON是一個輕量級的數據交換格式,通過具有嵌套數據元素的結構,數據格式比較簡單,易于讀寫,格式都是壓縮的,占用帶寬小,用鍵值對來定義對象,各種編程語言都提供了豐富的解析手段。 而且JSON格式能夠直接為服務器端代碼使用, 大大簡化了服務器端和客戶端的代碼開發量。
具體比較如圖3所示:

圖3 實況信息采用XML和JSON存儲對比
圖3給出了相同天氣實況信息分別采用兩種方式存儲后的截圖,采用XML格式存儲文件大小為300字節,而采用JSON格式存儲文件大小僅為197字節,在傳輸同等價值信息的情況下,JSON數據封裝的體積小,能有效的提高傳輸效率。
3.2 天氣預報詳細數據解析
鑒于JSON的優勢,獲取到JSON格式的天氣預報詳細數據后,對該數據進行解析,以獲取到天氣相關的各項指數。
Android下JSON數據的解析常見的有三種方式:(1)使用android.util包下的JsonReader類;(2)使用org.json包下的JSONTokener類及其他幾個輔助類;(3)使用谷歌開發的Gson工具類。由此也可看出android對JSON的解析提供了多種途徑,對采用JSON格式交換數據是相當認可的。
JSON數據簡單來說包含對象和數組兩種,通過這兩種結構可以表示各種復雜的結構。下面給出org.json包下提供的相關類解析JSON數據的基本方法:
JSONObject類對應于一個JSON對象,通過get和put方法從對象中讀取鍵值和向對象中寫入鍵值。
JSONStringer類為JSON文本構建類,可以幫助快速便捷的創建JSON文本串。
JSONArray類代表一組有序的數值,通過get和put方法讀取和寫入值。
JSONTokener類則用于從一個字符串生成一個JSON解析類的對象,可以從該對象中分離出JSON對象和數組。
整個應用分成兩個部分:城市的設置和天氣信息查看。為了給用戶更多空間用于瀏覽信息,其他功能采用菜單完成,用戶觸摸菜單項進入相應界面,城市設置采用對話框來完成,界面簡潔,使用方便。
4.1 城市設置
由于數據庫中城市眾多,在選擇城市時給出一個Spinner控件,加載所有的省份數據,先讓用戶選擇對應的省份,得到省份后自動對城市進行篩選,用另一個Spinner控件加載篩選后的結果,當用戶選擇城市后,將城市名轉換為城市ID號,然后到服務器上讀取對應城市的天氣預報詳細數據,界面參照圖如圖4所示:

圖4 城市設置界面
數據加載核心代碼如下:
provinceAdapter=new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,db.getAllProvince());
provinceAdapter.setDropDownViewResource(android.R. layout.simple_spinner_dropdown_item);
province.setAdapter(provinceAdapter);
4.2 應用主界面
獲取到天氣預報詳細數據后,對數據進行解析,將解析后的數據在界面上用ImageView和TextView控件顯示出來,界面參照如圖5所示:

圖5 應用主界面
天氣預報詳細數據獲取核心代碼如下:
URL url = new
URL("http://m.weather.com.cn/atad/"+cityId+".html");
BufferedReader reader=new BufferedReader(new InputStreamReader(url.openStream(),"utf-8"));
String weatherStr=reader.readLine();
數據解析核心代碼如下:
JSONTokener weatherT=new JSONTokener(weatherStr);
JSONObject json=(JSONObject) weatherT.nextValue();
json=json.getJSONObject("weatherinfo");
weather=new Weather();//Weather為天氣數據封裝類
weather.setCity(json.getString("city"));
weather.setCityId(json.getString("cityid"));
weather.setDate_y(json.getString("date_y"));
weather.setDate(json.getString("date"));
weather.setFchh(json.getString("fchh"));
……
Android系統全球市場份額逐步提高,移動終端app開發前景廣闊,綜合現有天氣預報app的優缺點,將所需資源文件預置到應用之中,采用JSON格式進行數據交換,判斷用戶查看時間決定加載或者下載數據,有效降低了數據流量、提高了應用處理速度、降低了開發難度。應用界面上只顯示了部分天氣數據,可在該應用基礎上進行擴展,提供給用戶更多個性化服務。
參考文獻
[1] 閆娜,閆蕾.基于Android的個性天氣預報系統的設計與軟件實現[J].計算機光盤軟件與應用,2012,7:155.
[2] 蘇亞光.Android手機平臺下Google天氣預報客戶端的開發[J].電腦編程技巧與維護,2012,3:60.
[3] 雷映喜.XML與JSON在WEB中對數據封裝解析的對比[J].價值工程,2013,9:210.
[4] 龔成瑩.基于JSON的Android移動終端與PHP及MySQL數據通信[J].工業儀表與自動化裝置,2013,1: 63.
[5] 權重民.利用JSON實現Android高效、安全訪問遠程數據庫的一種方式[J].韶關學院學報.2011,12:16.
[6] 扶松柏,于秀青.Android開發從入門到精通[M].北京:北京希望電子出版社,2012,7:4.
[7] 李華明.Android游戲編程之從零開始[M].北京:清華大學出版社,2014,7:1.
[8] 屈展.JSON在AJAX數據交換中的應用研究[J].西安石油大學學報,2011,26:96.
Realization of Weather Forecast App Based on JSON in Android
Xiong Chuanyu, Xu Youhua
(Department of Computers, Guangdong Songshan Vocational College, Shaoguan 512126, China)
Abstract:Among these Apps for weather forecast based on Android platform, most of them use XML to exchange data, which needs to download pictures and other materials from the websites of service providers. It results in occupying more website traffic and more difficulties in development. It adopts JSON to do data exchange instead of XML, and some source files needed for program running are put into the Apps so that only core data need to be downloaded when it is running. Thus, it reduces the visit traffic and improves the processing speed.
Key words:Android; XML; JSON; Weather Forecast; App
(收稿日期:2014.04.22)
作者簡介:熊傳玉(1979-),女,漢族,湖北荊州人,廣東松山職業技術學院,計算機系,講師,碩士,研究方向:web開發,韶關,512126徐尤華(1977-),男,漢族,湖北荊門人,廣東松山職業技術學院,計算機系,講師,碩士,研究方向:信息系統項目開發與管理,韶關,512126
基金項目:廣東省教育廳資助項目 (粵教高函[2012]54號-A12)
文章編號:1007-757X(2016)01-0008-03
中圖分類號:TP391
文獻標志碼:A