2011-11-01 80 views
2

我需要解析關於議程中事件的JSON響應,其中的字段是動態的。該字段根據事件發生的月份而變化。Android:使用GSON解析帶有動態字段的響應

現在我以前一直在用GSON解析數據,但是這些都有靜態字段,所以很容易創建必要的POJO。但是,我將如何與動態字段做到這一點?

我需要解析的響應是,像這樣:

{ 
    "Agenda/Future": { 
    "November 2011/0": [ 
     { 
     "id": "5675", 
     "eventid": "", 
     "name": "testing testing 123", 
     "startdate": "nov 25", 
     "datecompute": "2011-11-25T08:00:00", 
     "group_month": "November 2011", 
     "flg_Data": "Database" 
     } 
    ], 
    "February 2012/1": [ 
     { 
     "id": "5681", 
     "eventid": "", 
     "name": "dfd", 
     "startdate": "feb 3", 
     "datecompute": "2012-02-03T12:00:00", 
     "group_month": "February 2012", 
     "flg_Data": "Database" 
     }, 
     { 
     "id": "5679", 
     "eventid": "", 
     "name": "vfvd", 
     "startdate": "feb 17", 
     "datecompute": "2012-02-17T12:00:00", 
     "group_month": "February 2012", 
     "flg_Data": "Database" 
     } 
    ], 
    "February 2013/2": [ 
     { 
     "id": "5680", 
     "eventid": "", 
     "name": "df", 
     "startdate": "feb 14", 
     "datecompute": "2013-02-14T12:00:00", 
     "group_month": "February 2013", 
     "flg_Data": "Database" 
     } 
    ], 
    "September 2013/3": [ 
     { 
     "id": "5677", 
     "eventid": "", 
     "name": "fsdfsd", 
     "startdate": "sep 14", 
     "datecompute": "2013-09-14T12:00:00", 
     "group_month": "September 2013", 
     "flg_Data": "Database" 
     } 
    ], 
    "November 2015/4": [ 
     { 
     "id": "5676", 
     "eventid": "", 
     "name": "fsdfsd", 
     "startdate": "nov 13", 
     "datecompute": "2015-11-13T12:00:00", 
     "group_month": "November 2015", 
     "flg_Data": "Database" 
     } 
    ] 
    } 
} 

正如你所看到的,關於個月目標標題是動態的。標題末尾的值以及標題本身都會根據月份數組中的實際月份和位置進行更改。

從我在SO上看到的其他問題中,我將需要使用Maps。 但我不太確定我會如何去做。 假設我爲每個月的數組中包含的單個事件創建一個名爲Event的POJO,我的初始化將是什麼樣子?

問候


我以傑克遜默認Map試圖阿米爾的建議。 不幸的是,這會創建一個尺寸爲1Map。整個JSON響應被解析成單個對象。當然,這不是我想要的,因爲我需要從單個事件中獲取數據。

有沒有人有建議,我怎麼能做到這一點?通常我會很快弄清楚這些事情,但由於動態對象的命名,我無法圍繞這一點。


我最終設法解決了這個問題。我結束了使用普通的JSONObjects,最終工作。

我用得到它的工作的代碼如下:

 JSONObject jsonObject = new JSONObject(response); 
     JSONObject agenda = jsonObject.getJSONObject("Agenda/Future"); 

     if (agenda != null) { 
      System.out.println(agenda.length()); 
      JSONArray events = agenda.names(); 
      if (events.length() > 0) { 
       System.out.println("At least its bigger then 0. It's: " 
         + events.length()); 
       for (int i = 0; i < events.length(); i++) { 
        System.out.println(events.get(i).toString()); 
        JSONArray test = agenda.getJSONArray(events.get(i) 
          .toString()); 
        if (test != null) { 
         JSONObject testt = test.getJSONObject(0); 
         if (testt != null) { 
          System.out.println(testt.getString("name")); 
         } else { 
          System.out.println("Still empty, Check again."); 
         } 
        } 
       } 
      } 

     } else { 
      System.out.println("Agenda is completely empty, try again."); 
     } 

正如你所看到的,這還包含測試的名稱,但至少它的工作原理。 感謝大家的幫助!

+0

+1不錯的問題。 – Venky

回答

1

由於月份數據不是有效的java標識符,您可能必須使用custom serialization與GSON。您正在討論使用Map對象,但如果您打算這樣做,那麼您可能還會使用像JSONObject這樣的對象,它們基本上都是基於地圖/散列表構建的。

+0

自從Amir的見解看起來我需要一個答案後,第一次拋棄這個答案後,我最終嘗試了正常的'JSONObject's,最終它幫助我解決了我的問題。非常感謝!公認 –

1

如果您所說的所有字段都是動態的,那麼您可以在pojo中創建所有字段的超集。但這並沒有什麼幫助,我認爲Map是最好的解決方案。使用GSON,你可以做

Type type = new TypeToken<Map<String, String>>(){}.getType(); 
Map<String, String> map = gson.fromJson("{'key1':'123','key2':'456'}", type); 

這將返回一個字符串圖。

雖然之前我沒有真正使用過GSON。我一直很高興與Jackson lib和使用,你可以做

new ObjectMapper().readValue("...json...", Map.class) 

上面會返回地圖的地圖這是你想要的。

+0

我可能會給傑克遜一個這樣的旋風,但如果可能的話,我寧願使用GSON,因爲那是我目前擁有最多經驗的人。 然而,你的快速示例在'Map'中使用了2個'Strings',你認爲它會起作用嗎?如果我使用類似的東西: 'Type type = new TypeToken >(){}。getType (); Map map = gson.fromJson(myJsonrResponse,type);' 像我在我原來的帖子中說過的?與傑克遜 –

+0

我知道這將工作,因爲我已經嘗試過。對於GSON,我認爲事件地圖將起作用。但我不確定地圖的地圖。 –

+0

我設法最終解決了我的問題,但是mjmarsh給了我最後工作的建議。非常感謝提到傑克遜,它確實看起來相當有用,所以我相信我會在將來使用它 –