天天看點

Android Gson解析複雜多重資料過程及錯誤排查

         最近在做天氣預報的項目,需要用到多重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方法,而且這些都是有規矩的。       如下圖:

Android Gson解析複雜多重資料過程及錯誤排查
Android Gson解析複雜多重資料過程及錯誤排查

    好吧,還是不行,胡打亂闖之下,回歸了理性,我開始讀Log,來分析其中的錯誤:

Android Gson解析複雜多重資料過程及錯誤排查

這裡事實上隻看第一個錯誤即可: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;      

  實驗結果是正确的,松了一口氣 ~_-

Android Gson解析複雜多重資料過程及錯誤排查

  做到這裡,我還是想驗證所有我不太清楚的點,第一,我改了類名,比如把内部類的名稱改了,這裡證明是不會有影響的,但是字段名是一定要一樣的。第二,我又建了一個和開始一樣的,隻有極簡的結構類,嘗試如果沒有 setter和getter有沒有影響,結果是沒影響的,toString也是可有可無的。     總之,隻要保證對JSON結果的正确解構,還有分析對象,是單個類,還是一個集合類。     最後,學習的過程中,要盡量地去嘗試,不斷地思考,不要嫌簡單,遇到問題,不要想着去依賴别人幫自己解決,問題千變萬化,自己還得停下來想想。           感謝閱讀,如果不妥的地方,請指出。