我會通過創建一個自定義JsonDeserializer
並在解析之前將其註冊到您的Gson
實例來解決此問題。這個自定義解串器將被設置爲處理int
和真實對象。
首先,您需要建立一系列模型對象來表示數據。下面是什麼,可能看起來像一個模板:
private static class TopLevel {
@SerializedName("response")
private final List<ResponseElement> elements;
private TopLevel() {
this.elements = null;
}
}
private static class ResponseInteger implements ResponseElement {
private final int value;
public ResponseInteger(int value) {
this.value = value;
}
}
private static class ResponseObject implements ResponseElement {
@SerializedName("id")
private final String id;
@SerializedName("text")
private final String text;
private ResponseObject() {
this.id = null;
this.text = null;
}
}
private interface ResponseElement {
// marker interface
}
TopLevel
和ResponseObject
有私有的構造,因爲它們將讓GSON使用反射設置各自的領域,而ResponseInteger
有一個公共的構造函數,因爲我們要手動調用它來自我們的自定義解串器。
顯然你必須填寫ResponseObject
與其餘的領域。
解串器相對簡單。你發佈的json只包含兩種元素,我們將利用它。每次調用解串器時,它都會檢查元素是否爲基元,如果是(否則返回ResponseInteger
),否則返回ResponseInteger
(否則返回ResponseObject
)。
private static class ResponseElementDeserializer implements JsonDeserializer<ResponseElement> {
@Override
public ResponseElement deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json.isJsonPrimitive()) {
return new ResponseInteger(json.getAsInt());
}
else {
return context.deserialize(json, ResponseObject.class);
}
}
}
要使用此解串器,你就必須使用GsonBuilder
對象與GSON進行註冊。
private static Gson getGson() {
return new GsonBuilder()
.registerTypeAdapter(ResponseElement.class, new ResponseElementDeserializer())
.create();
}
就是這樣。現在你可以使用這個Gson
對象來輕鬆解析TopLevel
對象!
public void parseJson() {
TopLevel t = getGson().fromJson(json, TopLevel.class);
for (ResponseElement element : t.elements) {
System.out.println(element);
}
}
8061
[450602: Поздравляем!]
[451700: С реакцией чата и рассуждениями Папани после рипа..]
[451578: Помним...Любим...Скорбим...<br>2107 забирает лучших]
[451371: Земля тебе пухом братишка]
[451332: Доигрался, минус 900 экзов<br><br>R I P]
[451269: ]
[451242: https://www.twitch.tv/arthas подрубка<br><br>evilpapech.ru - скидка 30% на футболки!]
[451217: ]
[451181: или так це жерстко?]
[451108: ]
我用這些toString()
方法,這是我以上爲簡潔起見省略:
@Override
public String toString() {
return Integer.toString(value);
}
@Override
public String toString() {
return "[" + id + ": " + text + "]";
}
這是一個無效JSON文檔。你能粘貼真實的迴應嗎? –
這是真實的 - https://pastebin.com/uW9qBa6s。對不起,無法顯示請求導致它使用令牌。 –
感謝您的幫助。看到我的回答,並讓我知道它是否有效 –