標籤:
離上一篇文章過去才4、5天,我們趕緊趁熱打鐵繼續完畢該系列的天氣軟體的開發。
承接上一章的內容使用Volley實現網路的通訊。返回給我們的是這一串Json資料{"weatherinfo":{"city":"杭州","cityid":"101210101","temp1":"1℃","temp2":"10℃","weather":"多雲轉晴","img1":"n1.gif","img2":"d0.gif","ptime":"18:00"}},不知有沒有同學跟著我的步驟已經得到了以上的Json資料呢,接下來我們須要在我們的Android對以上資料解析!Lets go!
一、什麼是Json?
Json是一種相似於XML的通用資料交換格式,具有比XML更高的傳輸效率,體積較小,在網路傳輸時也能夠更節省流量。但缺點也有,相比於XML語義性更差。看起來遠不如XML直觀。
從結構上看,全部的資料(data)終雩都能夠分解成三種類型,但如今基本上經常使用的就是映射(mapping)這樣的類型,一個名/值對(Name/value),即資料有一個名稱,另一個與之相相應的值,這又稱作散列(hash)或字典(dictionary),比方"首都:北京"。它的規格呢也是非常easy固定的。
(1) 並列的資料之間用逗號(",")分隔,如"city":"杭州","cityid":"101210101",city與cityid兩個資料之間是用,隔開的
(2) 映射用冒號(":")表示。如"city":"杭州"
(3) 並列資料的集合(數組)用方括弧("[]")表示。比方假設返回的資料是有好幾天的,那麼天氣的資料就會有好幾組,會返回相似以下的資料形式"weatherinfo":[{"city":"杭州","cityid":"101210101","temp1":"1℃","temp2":"10℃","weather":"多雲轉晴","img1":"n1.gif","img2":"d0.gif","ptime":"18:00"},{"city":"杭 州","cityid":"101210101","temp1":"1℃","temp2":"10℃","weather":"多雲轉晴","img1":"n1.gif","img2":"d0.gif","ptime":"18:00"}]
(4) 映射的集合(對象)用大括弧("{}")表示。比如中國天氣網給我們返回的首先是一整個是Weather對象。然后里頭包括一個Weatherinfo對象。
二、怎樣解析Json資料?
我們先使用最簡單的方法解析中國天氣網返回的資料。
/** * 解析server返回的JSON資料,並將解析出的資料存放區到本地。 */public static void handleWeatherResponse(Context context, String response) {try {JSONObject jsonObject = new JSONObject(response);JSONObject weatherInfo = jsonObject.getJSONObject("weatherinfo");String cityName = weatherInfo.getString("city");String weatherCode = weatherInfo.getString("cityid");String temp1 = weatherInfo.getString("temp1");String temp2 = weatherInfo.getString("temp2");String weatherDesp = weatherInfo.getString("weather");String publishTime = weatherInfo.getString("ptime");saveWeatherInfo(context, cityName, weatherCode, temp1, temp2,weatherDesp, publishTime);} catch (JSONException e) {e.printStackTrace();}}
將server返回的response通過建立一個JSONObject對象 jsonobject,再通過weatherinfo這個key值去擷取它所相應weatherinfo所包括的屬性,之後就通過getString()通過索引值對映射的方法一個個擷取當中的對象值啦!
是不是覺得寫起來好麻煩啊。有反覆啊。無腦操作的代碼要反覆寫好幾遍了。
三、使用Gson解析資料? 假設你覺得JSONObject解析JSON資料的方法已經足夠簡單,那你真的太容易滿足了,Gson開源庫能夠讓解析資料簡單到難以置信的!
只是萬事的開頭你還得先去下載一下GSONde jar包,匯入自己的程式檔案中。
然後呢我們再看一下我們要解析的Json資料格式{"weatherinfo":{"city":"杭州","cityid":"101210101","temp1":"1℃","temp2":"10℃","weather":"多雲轉晴","img1":"n1.gif","img2":"d0.gif","ptime":"18:00"}},依據其格式我們先定義一個weather類。
package com.melhc.model;public class Weather {private Weatherinfo weatherinfo;public Weatherinfo getWeatherinfo() {return weatherinfo;}public void setWeatherInfo(Weatherinfo weatherinfo) {this.weatherinfo = weatherinfo;}}
然後這個weather類裡有一個weatherinfo對象,這個對象呢又包括著city,cityid,temp1等等的對象,該怎麼辦呢。
package com.melhc.model;public class Weatherinfo { private String city; private String cityid; private String temp1; private String temp2; private String weather;private String ptime;public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getCityid() {return cityid;}public void setCityid(String cityid) {this.cityid = cityid;}public String getTemp1() {return temp1;}public void setTemp1(String temp1) {this.temp1 = temp1;}public String getTemp2() {return temp2;}public void setTemp2(String temp2) {this.temp2 = temp2;}public String getWeather() {return weather;}public void setWeather(String weather) {this.weather = weather;}public String getPtime() {return ptime;}public void setPtime(String ptime) {this.ptime = ptime;}@Overridepublic String toString() {return "WeatherInfo [city=" + city + ", cityid=" + cityid + ", temp1="+ temp1 + ", temp2=" + temp2 + ", weather=" + weather+ ", ptime=" + ptime + "]";}}
僅僅要在定義一個weatherinfo類就好了,加入city等等欄位到該類裡頭。而且注意屬性的資料類型要一一相應的否則會解析失敗的,萬事具備。剩下來的就交給Gson吧
public static void handleWeatherResponse(Context context, String response) {try {Gson gson = new Gson();Weather weather = gson.fromJson(response, Weather.class);Weatherinfo info = weather.getWeatherinfo();saveWeatherInfo(context, info);} catch (Exception e) {// TODO: handle exception}}
看到沒有僅僅須要三步就完畢了資料的解析。有沒有非常easy呢!
我們僅僅須要通過gson,from()方法就能夠把資料內容映射到指定類中!SO,easy! 大家可能注意到在這三步驟結束之後另一個saveWeatherinfo方法。這種方法用來幹嘛的呢!
public static void saveWeatherInfo(Context context, Weatherinfo info) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy年M月d日", Locale.CHINA);SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();editor.putBoolean("city_selected", true);editor.putString("city_name", info.getCity());editor.putString("weather_code", info.getCityid());editor.putString("temp1", info.getTemp1());editor.putString("temp2", info.getTemp2());editor.putString("weather_desp", info.getWeather());editor.putString("publish_time", info.getPtime());LogUtil.i("UTILITY", "----------------->" + sdf.format(new Date()));editor.putString("current_date", sdf.format(new Date()));editor.commit();}
這種方法就是我們使用Sharedpreference共用參數儲存一下我們當天得到的天氣資料,這樣使用者每次開啟就能夠直接讀取之前得到的資料,在有須要的時候再通過網路擷取即時的天氣資料就好了。editor.put方法還不能直接儲存類。僅僅能儲存主要的資料類型,我們這裡就僅僅能一個個put啦。
好的。這一節課的內容就說到這裡。也希望大家能繼續支援該系列的博文。你們的支援是我寫下去的最大動力!今天的GSON解析資料的內容就到此結束,下一篇博文也會非常快跟大家見面的。
以下是該應用的Git開源地址。https://github.com/melhc/SimpleWeather 2014部落格之星請支援一下啊。http://vote.blog.csdn.net/blogstar2014/details?
username=u013900875#content
一起來開發Android的天氣軟體(四)——使用Gson解析資料