注意:通過創建2個不同的GSON模型可以輕鬆實現此操作,但我正在尋找解決方法。gson讀取不同結構的相同字段
我有一個與多個JSON響應一起工作的模型。但是,有一個迴應:
items: [
{
kind: "youtube#playlistItem",
etag: ""fpJ9onbY0Rl_LqYLG6rOCJ9h9N8/jqbcTLu8tYm8b1FXGO14gNZrFG4"",
id: "PLUQ7I1jJqKB4lJarGcpWsP62l7iC06IkE2LDE0BxLe18",
與這一個(注意不同類型相同id
場以上id
是String
,另一種是Class
。)衝突:
items: [
{
kind: "youtube#searchResult",
etag: ""fpJ9onbY0Rl_LqYLG6rOCJ9h9N8/hDIU49vmD5aPhKUN5Yz9gtljG9A"",
id: {
kind: "youtube#playlist",
playlistId: "PLh6xqIvLQJSf3ynKVEc1axUb1dQwvGWfO"
},
是它可能只使用可讀取兩個響應的單個GSON模型?
非常感謝您的時間
UPDATE
這是我Model
裏面,我改變了id
變量從String
到Class
:
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;
}
}
});
非常感謝您的幫助。你能否詳細說明如何使用'JsonDeserializer'?我應該在當前的'Model'類中使用它嗎?因爲我以前從未使用過,現在仍在試驗 –
Model類代表整個響應?如果您覺得這兩種不同的ID代表不同類型的數據,您可以這樣做。但是,如果它們是以不同方式描述的相同數據,就像我的帖子中所描述的那樣,您可以使用封裝類。 我在我的文章中提供了文檔鏈接,並添加了對反序列化器註冊的描述! –
非常感謝。是的,這個模型代表了整個迴應。我試圖按照你的例子,但得到'沒有封閉類錯誤。敬請參閱我的更新問題 –