2012-07-21 50 views
2

我使用google gson-2.2.1庫來解析JSON的大型響應。Android:解析大型json響應

我必須解析一個JSON響應,其結構可能會有所不同。

第一種情況,當響應包含不止一個團隊:

"Details":{ 

      "Role":"abc", 
      "Team":[ 
       { 
       "active":"yes", 
       "primary":"yes", 
       "content":"abc" 
       }, 
       { 
       "active":"yes", 
       "primary":"yes", 
       "content":"xyz" 
       } 
      ], 

第二種情況下,當只有一個團隊傳遞:

"Details":{ 

      "Role":"abc", 
      "Team": 
       { 
       "active":"yes", 
       "primary":"yes", 
       "content":"abc" 
       } 
} 

有用於解析我的基類:

class Details { 
    public String Role; 
    public ArrayList<PlayerTeams> Team = new ArrayList<PlayerTeams>(); 
     PlayerTeams Team; // when JsonObject 
} 

class PlayerTeams { 
    public String active; 
    public String primary; 
    public String content; 
} 

問題是我不能使用ArrayList<PlayerTeams>當我只有其中一個nd將它作爲JsonObject返回。

Gson可以識別JSON響應的靜態格式。我可以通過檢查「Team」鍵是否爲JsonArrayJsonObject的實例來動態追蹤完整響應,但如果有更好的解決方案可用,那麼這將非常有用。

編輯: 如果我的回答更加動感..

"Details":{ 

     "Role":"abc", 
     "Team": 
      { 
      "active":"yes", 
      "primary":"yes", 
      "content":"abc" 
      "Test": 
      { 
       "key1":"value1", 
       "key2":"value2", 
       "key3":"value3" 
      } 
      } 
} 

在我編輯的問題,我面對的問題,而我的反應是更加動態.. TeamTest可以JsonArrayJsonObject。它確實騷擾我,因爲有時候對象可能會在更多數據的時候數組,當單個數據時可能對象,當沒有數據的時候可能是數組。迴應沒有一致性。

+0

如果你讀JSONArray代替的JSONObject會發生什麼?你有沒有得到任何異常或null? – 2012-07-21 12:25:09

+0

如果您爲JsonObject使用ArrayList,則Google Gson會拋出異常。 – 2012-07-21 12:27:35

+0

您可以嘗試讀取catch塊中的JSONObject。 – 2012-07-21 12:28:51

回答

1

您需要一個類型適配器。這個適配器將能夠區分哪種格式即將到來,並使用正確的值實例化正確的對象。

你可以這樣做:

  1. 通過創建一個類實現JsonSerializer<List<Team>>, JsonDeserializer<List<Team>>,當然只是需要你需要序列化在此問題上過於情況下JsonSerializer實現自己的類型的適配器。
  2. 註冊類型的適配器給你GsonBuilder喜歡:new GsonBuilder().registerTypeAdapter(new TypeToken<List<Team>>() {}.getType(), new CoupleAdapter()).create()

的反序列化方法可以是這樣的:

public List<Team> deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) 
     throws com.google.gson.JsonParseException { 
    if (json.isJsonObject()) { 
     return Collections.singleton(context.deserialize(json, Team.class)); 
    } else { 
     return context.deserialize(json, typeOfT); 
    } 
} 
+0

我可以註冊兩個或更多'TypeAdapter'以獲得較大的響應。我試過並進入無限循環。因爲反序列化無限調用。我測試了 – 2012-10-17 07:56:56

+0

你的目標是什麼? – 2012-10-17 08:29:11

+0

請參閱...問題已編輯 – 2012-10-17 09:15:58