熊传玉,徐尤华
Android系统下基于JSON的天气预报应用的实现
熊传玉,徐尤华
摘 要:在众多基于Android平台的天气预报的APP中,目前多采用XML来进行数据交换,图片等各项素材都需要从服务提供商的网站上下载,这样会占用较多流量,并且开发难度也较大。采用JSON数据替代XML数据来进行数据交换,将运行程序所需一些资源文件放置于应用之中,运行时只需下载核心数据,这样有效地降低了访问流量,并且提高了处理速度。关键词:Android;XML;JSON;天气预报;app
目前,利用手机app获取天气预报信息正在成为主流的天气信息获取方式。所以越来越多的开发人员致力于开发简单、美观且实用的手机天气预报app。但是大多数已经开发出来的手机天气预报app都是通过XML来进行数据交换,手机app发出请求,服务器以XML的形式封装好相应数据后返回给app[1-2]。
由于XML文件格式复杂,所以在传输过程中占较多的带宽。客户端不同浏览器之间解析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℃”。“temp3”:“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