在Retrofit 中使用GSON 提取巢狀JSON 物件
當使用包含巢狀資料的JSON 物件進行回應的API 時,可能會回應會變得具有挑戰性直接提取相關數據並進行操作。當所需資料隱藏在中間「內容」欄位中時尤其如此。
為了克服這個障礙,GSON 提供了一種用於創建自定義反序列化器的機制,該機制可用於從響應JSON 中提取特定字段.
創建自訂反序列化器
建立自訂反序列化器deserializer,定義一個實作JsonDeserializer介面的新類,如下所示:
class MyDeserializer implements JsonDeserializer<Content> { @Override public Content deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException { // Get the "content" element from the parsed JSON JsonElement content = je.getAsJsonObject().get("content"); // Deserialize it. Use a new instance of Gson to avoid infinite recursion return new Gson().fromJson(content, Content.class); } }
針對不同內容類型的通用反序列化器
如果您有不同類型的消息,但全部共用一個「內容」字段,您可以建立一個通用的反序列化器:
class MyDeserializer<T> implements JsonDeserializer<T> { @Override public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException { // Get the "content" element from the parsed JSON JsonElement content = je.getAsJsonObject().get("content"); // Deserialize it. Use a new instance of Gson to avoid infinite recursion return new Gson().fromJson(content, type); } }
在Retrofit中註冊反序列化器
建立反序列化器後,在建立Retrofit實例時將其註冊到GsonConverterFactory:
Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create(gson)) .build();
範例用法:
使用自訂反序列化器後,您現在可以將JSON 回應直接反序列化為所需的POJO:
Content c = gson.fromJson(myJson, Content.class);
透過使用自訂反序列化器,您可以靈活地根據您的特定需求自訂JSON 解析過程,讓您可以輕鬆存取和操作JSON回應中的嵌套資料。
以上是如何使用自訂 GSON 反序列化器從 Retrofit 回應中提取巢狀 JSON 物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!