首頁 >Java >java教程 >如何使用Retrofit和Gson高效提取嵌套JSON資料?

如何使用Retrofit和Gson高效提取嵌套JSON資料?

Barbara Streisand
Barbara Streisand原創
2024-11-19 17:36:03314瀏覽

How Can I Efficiently Extract Nested JSON Data Using Retrofit and Gson?

使用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;從JSON 回應中提取「內容」元素並將其反序列化為內容POJO:

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

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