我想使用改造接收項目并將它們解析為 Java 列表。但是,服務器響應不是 JSON 數組,而是包含項目的 JSON 對象。這就是為什么改造不能只將響應轉換為 java 列表的原因。響應看起來像這樣:{ "4": { "key": "value", ... }, "5": { ... }, ...}通常,我會嘗試收到這樣的物品:@GET("items")Call<List<Item>> getItems();但這顯然行不通,Retrofit 回應:Expected BEGIN_ARRAY but was BEGIN_OBJECT使用改造將此對象轉換為 Java 列表的最佳選擇是什么?
2 回答

Helenr
TA貢獻1780條經驗 獲得超4個贊
我個人會分 2 個步驟執行此操作,以避免必須為反序列化編寫自定義適配器。
我會寫這樣的界面:
@GET("items") Call<Map<String, Item>> getItems();
一旦您根據響應調用 API,我就會調用values()
.
需要考慮的是,因為 API 返回的是地圖而不是列表,所以無法保證您生成的任何列表的順序都是一致的。json 標準不定義對象的任何順序,除非它們在 json 數組中。

慕工程0101907
TA貢獻1887條經驗 獲得超5個贊
當您說響應是 List 時,JSON 應該是“ARRAY”。
例如:
[ "a", "b" ]
或者
{
"xxx": [ "a", "b" ]
}
在任何一種情況下,您想要解析的對象如下所示:
List<String>對于第一個。
Thing對于第二個。
看起來Thing像:
class Thing {
public List<String> xxx;
}
你正在嘗試解析這個:
{
"4": {
"key": "value",
...
},
"5": {
...
},
...
}
那么根據以上信息,您認為解析后的響應是什么樣的?(提示:您可以嘗試像這個Java POJO 生成器這樣的東西來獲得一個想法;)
添加回答
舉報
0/150
提交
取消