首頁  >  文章  >  Java  >  如何使用自訂 GSON 反序列化器從 Retrofit 回應中提取巢狀 JSON 物件?

如何使用自訂 GSON 反序列化器從 Retrofit 回應中提取巢狀 JSON 物件?

Patricia Arquette
Patricia Arquette原創
2024-11-23 06:40:25792瀏覽

How to Extract Nested JSON Objects from Retrofit Responses using Custom GSON Deserializers?

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn