要開始,你的JSON導致異常被拋出,因爲它是無效的 - 你必須在第二個例子中的最後一個值的末尾一個額外的逗號。 "3": 8536,
應該是"3": 8536
。
修復後,這應該是一個簡單的任務,只要你正確定義你的對象。以下是我想出了:
public class Results {
@SerializedName("Result")
List<Result> results;
}
public class Result {
String title;
Map<String, Integer> results;
}
從那裏,Result
類需要在一個特殊的方式來反序列化,因爲在Result
類中的字段不直接映射到JSON條目。相反,我們需要取消每個Result
中包含的JsonArray
的第一個和第二個元素,並相應地對其進行解析。看起來像這樣:
public class ResultDeserializer implements JsonDeserializer<Result> {
@Override
public Result deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonArray array = json.getAsJsonArray();
Result result = new Result();
result.title = array.get(0).getAsString();
result.results = new LinkedHashMap<String, Integer>();
for(Entry<String, JsonElement> entry : array.get(1).getAsJsonObject().entrySet()) {
result.results.put(entry.getKey(), entry.getValue().getAsInt());
}
return result;
}
}
請注意,我的示例省略了錯誤檢查。最後,註冊這個解串器,你應該準備就緒:
Gson gson = new GsonBuilder().registerTypeAdapter(Result.class, new ResultDeserializer()).create();
Results results = gson.fromJson(json, Results.class);
for(Result r : results.results) {
System.out.println("Title = " + r.title);
for(Entry<String, Integer> entry : r.results.entrySet()) {
System.out.println("\t " + entry.getKey() + " -> " + entry.getValue());
}
}
此打印:
Title = Title
0 -> 1323
1 -> 3358
2 -> 2123
3 -> 8536
4 -> 1399
5 -> 9303
7 -> 9732
8 -> 3433
9 -> 1383
Title = Title
0 -> 1323
1 -> 3358
2 -> 2123
3 -> 8536
我要把它留給OP實行反向,那就是爲Result
到串行產生相同的結果。
怎麼樣[ MCVE] – jkalden
在你的Json數據中,標題是必需的......或者任何類似於「Title:xyz」的標籤 –
@ Don'tBenegative「標題」是一個沒有鍵的對象,不像你提到的那樣。 – appukrb