2015-10-15 38 views
0

注意:通過創建2個不同的GSON模型可以輕鬆實現此操作,但我正在尋找解決方法。gson讀取不同結構的相同字段

我有一個與多個JSON響應一起工作的模型。但是,有一個迴應:

items: [ 
{ 
kind: "youtube#playlistItem", 
etag: ""fpJ9onbY0Rl_LqYLG6rOCJ9h9N8/jqbcTLu8tYm8b1FXGO14gNZrFG4"", 
id: "PLUQ7I1jJqKB4lJarGcpWsP62l7iC06IkE2LDE0BxLe18", 

與這一個(注意不同類型相同id場以上idString,另一種是Class。)衝突:

items: [ 
{ 
kind: "youtube#searchResult", 
etag: ""fpJ9onbY0Rl_LqYLG6rOCJ9h9N8/hDIU49vmD5aPhKUN5Yz9gtljG9A"", 
id: { 
kind: "youtube#playlist", 
playlistId: "PLh6xqIvLQJSf3ynKVEc1axUb1dQwvGWfO" 
}, 

是它可能只使用可讀取兩個響應的單個GSON模型?

非常感謝您的時間

UPDATE

這是我Model裏面,我改變了id變量從StringClass

private Id id; 
public class Id 
{ 
    private String id; 
    private String kind; 
    private String playlistId; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getKind() { 
     return kind; 
    } 

    public void setKind(String kind) { 
     this.kind = kind; 
    } 

    public String getPlaylistId() { 
     return playlistId; 
    } 

    public void setPlaylistId(String playlistId) { 
     this.playlistId = playlistId; 
    } 
} 

這是我做的請求:

 GsonBuilder gsonBuilder = new GsonBuilder(); 
     gsonBuilder.registerTypeAdapter(Response.class, 
       new JsonDeserializer<Item.Id>() { 
        @Override 
        public Item.Id deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { 
                if(jsonElement.isJsonObject()) 
         { 
          result.setKind(jsonElement.getAsJsonObject().get("kind").getAsString()); 
          result.setPlaylistId(jsonElement.getAsJsonObject().get("playlistId").getAsString()); 
          //return new Item.Id(jsonElement.getAsJsonObject().get("kind").getAsString(), jsonElement.getAsJsonObject().get("playlistId").getAsString()); 
          return result; 
         } 
         else 
         { 
          result.setId(jsonElement.getAsString()); 
          //return new Item.Id(jsonElement.getAsString()); 
          return result; 
         } 
        } 
       }); 

回答

2

問題

你只能有ID代表單一類型的變量,在這種情況下,你已經有了字符串的第一個響應,並在第二種情況下,你已經有了一個對象,其中有一個「樣「和‘playlistId’

這似乎是在後端側一個奇怪的設計,但它可能不是你的控制之下

解決方案

你可以做的是,如果你認爲在第一個和第二個ID OND反應是同一類型的,你可以創建一個能夠基於JSON響應類型的封裝類,將包含這些領域,如

class Id { 
    private String stringId; 
    private String kind; 
    private String playlistId; 
} 

,並創建一個自定義JsonDeserializer在下面的方式創建一個相應的ID對象:

new JsonDeserializer<Id>() { 
      @Override 
      public Id deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
       if(json.isJsonObject()) { 
        return new Id(json.getAsJsonObject().get("kind").getAsString(), json.getAsJsonObject().get("playlistId").getAsString()); 
       } else { 
        return new Id(json.getAsString()); 
       } 
      } 
     } 

並註冊您的GSON對象上,所以它會處理標識字段的反序列化,並根據其類型基地其創作

或者,你可以創建一個解串器,將反序列化CONTA根據id的類型在對象中使用不同的字段,但你應該明白!

return new GsonBuilder().registerTypeAdapter(Id.class, new JsonDeserializer<Id>() { 

    //.. 

}).build(); 

您可以:

您可以使用GsonBuilder和GsonBuilder調用registerTypeAdapter與你在和你想以下列方式使用typeadapter註冊類型適配器類型GSON註冊JsonDeserializer閱讀更多關於gson文檔中的自定義類型適配器的信息,here

+0

非常感謝您的幫助。你能否詳細說明如何使用'JsonDeserializer'?我應該在當前的'Model'類中使用它嗎?因爲我以前從未使用過,現在仍在試驗 –

+0

Model類代表整個響應?如果您覺得這兩種不同的ID代表不同類型的數據,您可以這樣做。但是,如果它們是以不同方式描述的相同數據,就像我的帖子中所描述的那樣,您可以使用封裝類。 我在我的文章中提供了文檔鏈接,並添加了對反序列化器註冊的描述! –

+0

非常感謝。是的,這個模型代表了整個迴應。我試圖按照你的例子,但得到'沒有封閉類錯誤。敬請參閱我的更新問題 –

相關問題