在現代應用程式中,經常會遇到具有嵌套 JSON 結構的 API 回應。當您想要使用嵌套層次結構中的特定資料欄位時,這可能會帶來挑戰。本指南將示範如何建立自訂 Gson 反序列化器,以使用 Retrofit 從巢狀 JSON 物件中提取所需內容。
考慮具有以下結構的API 回應:
{ 'status': 'OK', 'reason': 'Everything was fine', 'content': { < real data here > } }
您有帶有狀態和原因欄位的POJO,但您需要的資料位於嵌套內容中
要提取嵌套內容,您將建立一個包裝實際POJO 反序列化器的自訂反序列化器。它的運作方式如下:
class MyDeserializer implements JsonDeserializer<Content> { @Override public Content deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) { // Get the "content" element from the parsed JSON JsonElement content = je.getAsJsonObject().get("content"); // Deserialize it using a new Gson instance to avoid recursion return new Gson().fromJson(content, Content.class); } }
Gson gson = new GsonBuilder() .registerTypeAdapter(Content.class, new MyDeserializer()) .create();
Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create(gson)) .build();
現在,您可以反序列化API 回應並使用Retrofit 直接將嵌套內容作為Content 物件存取。
如果您有多種類型的消息共享一個「內容」字段,您可以建立一個通用反序列化器:如下:
class MyDeserializer<T> implements JsonDeserializer<T> { @Override public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) { // Get the "content" element from the parsed JSON JsonElement content = je.getAsJsonObject().get("content"); // Deserialize it using a new Gson instance to prevent recursion return new Gson().fromJson(content, type); } }
為您的每種內容類型註冊此反序列化器。 Retrofit 將根據 API 回應的類型自動使用適當的反序列化器。
以上是如何使用 Gson 和 Retrofit 從 API 回應中提取巢狀 JSON 物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!