新手入門,和風天氣預報免費API介面用GSON工具實現資料解析
作為一個入門不久的安卓小菜鳥,正在做一個個人專案。於是就想要做一個有關天氣的APP,所以到網上找一些免費的介面來獲得一些天氣的資料,找來找去,最後選中了百度API裡面的一個叫和風天氣預報的介面,如下圖,點選開啟連結
沒有預料到的是,我進了一個大大的坑中。和風天氣返回的JSON字串大概是這樣的。
沒錯,這一個JSON字串非常的複雜,裡面有物件,有陣列,物件裡面又嵌入了物件,陣列就更不用說了,裡面又有物件,又有普通的欄位。{ "HeWeather data service 3.0": [ { "aqi": { "city": { "aqi": "43", "co": "1", "no2": "31", "o3": "43", "pm10": "39", "pm25": "30", "qlty": "優", "so2": "9" } }, "basic": { "city": "廣州", "cnty": "中國", "id": "CN101280101", "lat": "23.108000", "lon": "113.265000", "update": { "loc": "2016-08-27 22:52", "utc": "2016-08-27 14:52" } }, "daily_forecast": [ { "astro": { "sr": "06:07", "ss": "18:49" },
由於我用的是GSON解析,因為這工具簡單易用,要真的按照JSON工具類解析,那得累死啊。不過這個GSON工具最麻煩的就是要建立實體類啦,
這個實體類的裡面的屬性是有要求的,就是必須跟返回JSON字串裡的key(屬性),一一對應。
比如說第一個屬性aqi,aqi裡面又有一個屬性city,city裡面才是我們要的值。那就必須得先建立一個類,類名隨便取,裡面只有一個屬性,屬性名必須得是city,而且這個city屬於另一個類,這個類裡面放的就是city的具體屬性啦,像pm25,co等等的啦。然後給這個city屬性加上get和set方法,全參與無參構造方法(此處我也不明白,反正是慣例了,大家有興趣可以搜尋一下)。
建立實體類就是體力活啦,要花很多的時間啦,當然這些都不是重點,最最最讓人吐血的是,第一個字頭,
<strong><span style="font-size:18px;color:#ff0000;"> "HeWeather data service 3.0"</span></strong>
這個屬性是個什麼鬼,中間帶有兩個空格,和一個點,這些都不能當做屬性名啊,但是要用GSON解析的話,必須得生成屬性名與JSON字元屬性名一樣的才行啊。這裡真的卡住了我,然後我就去網上搜,發現解決方法原來這麼簡單,要多謝這位大神了,詳情請點選大神的文章~~大神文章連結,在大神文章裡面發現了一個不得了的東西,叫GSONFORMAT的工具,這是在Android
studio中的一個外掛。這簡單是神器啊,可以自動建立實體類,那我還花這麼大力氣建立一整天的實體類。還有就是網上也有許多線上解析JSON生成實體類的網站,實在沒有必要這麼累去一個個建立實體類,當初真是的too young too simple。
我發現自己的腦筋不會轉變了,既然JSON字串不符合規範那麼處理一下不就行了嗎,當時真的犯二了,JSON字串本質上還是一個字串,有這麼多處理字串的方法。
有時候真的是,稍微變通一下難題就會迎刃而解,當然解決了問題還是很讓人愉快的,下面是我的程式碼。
String url="http://apis.baidu.com/heweather/weather/free";
ApiStoreSDK.execute(url, ApiStoreSDK.GET, para, new ApiCallBack(){
@Override
public void onSuccess(int status, String responseString) {
Log.d("hap.zhu", "success status="+status+",responseString="+responseString);
StringBuilder sb=new StringBuilder(responseString);
//處理字串,刪去兩個空格與3.0
sb.deleteCharAt(11);
sb.deleteCharAt(15);
sb.delete(22, 26);
String result=sb.toString();
Log.d("hap.zhu", "success status="+status+",responseString="+result);
//利用GSON工具解析
Gson gson=new Gson();
QueryResultForWeatherFirst weatherResult=gson.fromJson(result, QueryResultForWeatherFirst.class);
Log.d("hap.zhu", "weatherResult="+weatherResult);
}
Log顯示的結果如下
返回的天氣資料原始值
處理HeWeather頭字元值後資料值
用GSON成功解析,將資料變為一個個物件值
下面是我一整天的勞動成果,實體類一覽圖
當然名字是我用中式英語取的,大家可以自行取名,只要裡面的屬性名不變就行啦~~下載連結如右,實體類下載連結,希望大家可以體諒下我的吐血之作,賞賜我一點積分,謝謝大家啦,當然也可以自己去網上線上生成實體類,看個人喜好啦~~~