1. 程式人生 > >新手入門,和風天氣預報免費API介面用GSON工具實現資料解析

新手入門,和風天氣預報免費API介面用GSON工具實現資料解析

作為一個入門不久的安卓小菜鳥,正在做一個個人專案。於是就想要做一個有關天氣的APP,所以到網上找一些免費的介面來獲得一些天氣的資料,找來找去,最後選中了百度API裡面的一個叫和風天氣預報的介面,如下圖,點選開啟連結


  沒有預料到的是,我進了一個大大的坑中。和風天氣返回的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"
                    },
沒錯,這一個JSON字串非常的複雜,裡面有物件,有陣列,物件裡面又嵌入了物件,陣列就更不用說了,裡面又有物件,又有普通的欄位。

由於我用的是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成功解析,將資料變為一個個物件值

下面是我一整天的勞動成果,實體類一覽圖


當然名字是我用中式英語取的,大家可以自行取名,只要裡面的屬性名不變就行啦~~下載連結如右,實體類下載連結,希望大家可以體諒下我的吐血之作,賞賜我一點積分,謝謝大家啦,當然也可以自己去網上線上生成實體類,看個人喜好啦~~~