最近在做天氣預報的項目,需要用到多重JSON的解析,這裡我選用了目前流行的,也公認是最簡單易用的架構GSON來解析這個複雜的JSON,雖然在最後結果很簡單,但并不意味着整個過程很簡單,沒有一點問題,恰恰是相反的,我是第一次學習這個GSON,雖然在網上看部落格一看即知怎麼操作,但是一動手,卻發生問題還是有的。
首先,先上我的JSON結構:
{"desc":"OK","status":1000,"data":{"wendu":"15","ganmao":"晝夜溫差很大,易發生感冒,請注意适當增減衣服,加強自我防護避免感冒。","forecast":[{"fengxiang":"南風","fengli":"微風級","high":"高溫 16℃","type":"晴","low":"低溫 2℃","date":"14日星期二"},{"fengxiang":"南風","fengli":"微風級","high":"高溫 16℃","type":"多雲","low":"低溫 4℃","date":"15日星期三"},{"fengxiang":"南風","fengli":"微風級","high":"高溫 17℃","type":"多雲","low":"低溫 7℃","date":"16日星期四"},{"fengxiang":"南風","fengli":"微風級","high":"高溫 16℃","type":"陰","low":"低溫 5℃","date":"17日星期五"},{"fengxiang":"南風","fengli":"微風級","high":"高溫 19℃","type":"晴","low":"低溫 5℃","date":"18日星期六"}],"yesterday":{"fl":"微風","fx":"南風","high":"高溫 14℃","type":"晴","low":"低溫 2℃","date":"13日星期一"},"aqi":"38","city":"北京"}}
在實作時,我是有進行過分層的,這裡,我就忽略了……
首先,照着網上一個簡單的教程,我把JAVABEAN,設定成這樣:
{CSDN:CODE:public class TestBean {
public String desc;
public int status;
public List<Data> data;
public class Data {
public String wendu;
public String ganmao;
public List<Forecast> forecast;
public List<Yesterday> yesterday;
public String aqi;
public String city;
public class Forecast {
public String fengxiang;
public String fengli;
public String high;
public String type;
public String low;
public String date;}
public class Yesterday {
public String fl;
public String fx;
public String high;
public String type;
public String low;
public String date;}
}
}}
這裡有兩個點想說的,正确的是,一是成員變量名一定是跟JSON的字段完全一樣的,那個沒有“”的數字資料的話要用int,我一開始照着網上模仿這個,把内層的資料都用一個List<内部類名稱>來表示。結果是失敗的。 接着,我把代碼又拆成了網上分多個類出來,每個類都加多一個getter和setter,我本着大腦想,或許上個想得過于簡單,可能系統還需要重寫toString方法,而且這些都是有規矩的。 如下圖:
好吧,還是不行,胡打亂闖之下,回歸了理性,我開始讀Log,來分析其中的錯誤:
這裡事實上隻看第一個錯誤即可:Expected BEGIN_ARRAY but was BEGIN_OBJECT at…… data 由最後一個我們知道要定位到data變量所對應的類中去(對着我的JSON代碼來看問題),我仔細看了一下第一個類,類中我有這個
public List<Data> data
但是,事實上data裡隻有一個資料,也就是這裡隻有一個對象需要被建立。 然後,我試運作了一下,發現錯誤還是有,但是變了(這裡很關鍵),這說明确實這裡是有問題的。
// public List<Forecast> forecast;
// public List<Yesterday> yesterday;
在錯誤中,又把錯誤指向Yerterday。結合一下我的JSON格式,發現,在Yesterday這裡,又隻有一個是以隻生成一個對象,而Forecast卻不止。是以又把代碼改了。
public List<Forecast> forecast;
public Yesterday yesterday;
實驗結果是正确的,松了一口氣 ~_-
做到這裡,我還是想驗證所有我不太清楚的點,第一,我改了類名,比如把内部類的名稱改了,這裡證明是不會有影響的,但是字段名是一定要一樣的。第二,我又建了一個和開始一樣的,隻有極簡的結構類,嘗試如果沒有 setter和getter有沒有影響,結果是沒影響的,toString也是可有可無的。 總之,隻要保證對JSON結果的正确解構,還有分析對象,是單個類,還是一個集合類。 最後,學習的過程中,要盡量地去嘗試,不斷地思考,不要嫌簡單,遇到問題,不要想着去依賴别人幫自己解決,問題千變萬化,自己還得停下來想想。 感謝閱讀,如果不妥的地方,請指出。