使用Retrofit 使用GSON 獲取嵌套JSON 對象
問題概述:
當使用具有結構化JSON 響應的API像:
{ 'status': 'OK', 'reason': 'Everything was fine', 'content': { < some data here > }
其中所需的POJO 資料嵌套在「內容」欄位中,Retrofit 預設將整個JSON 回應反序列化為具有「狀態」和「原因」欄位的POJO ,但不是實際的POJO感興趣的數據。
自訂反序列化:
至自動擷取巢狀內容字段,您可以使用Gson 建立自訂反序列化器:
Content POJO:
定義一個表示巢狀資料的POJO類,例如如:
class Content { public int foo; public String bar; }
反序列化器:
實作JsonDeserializer
class MyDeserializer implements JsonDeserializer<Content> { @Override public Content deserialize(...) { JsonElement content = je.getAsJsonObject().get("content"); return new Gson().fromJson(content, Content.class); } }
Gson配置:
使用 GsonBuilder 建立一個 Gson實例,註冊自訂反序列化器:
Gson gson = new GsonBuilder() .registerTypeAdapter(Content.class, new MyDeserializer()) .create();
增強多種類型的反序列化器:
如果您有多種類型的帶有「內容」欄位的訊息,您可以如下概括反序列化器:
class MyDeserializer<T> implements JsonDeserializer<T> { @Override public T deserialize(...) { JsonElement content = je.getAsJsonObject().get("content"); return new Gson().fromJson(content, type); } }
註冊此反序列化器的實例適用於您的每種內容類型。
改造整合:
將自訂的Gson 實例傳遞給Retrofit 建構器:
Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create(gson)) .build();
透過此設置,Retrofit 現在將自動將自動提取「內容」欄位並將其解析為適當的內容POJO,無需手動欄位提取。
以上是如何使用Retrofit和Gson高效提取嵌套JSON資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!