ホームページ  >  記事  >  Java  >  Retrofit と Gson を使用してネストされた JSON データを効率的に抽出するにはどうすればよいですか?

Retrofit と Gson を使用してネストされた JSON データを効率的に抽出するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-19 17:36:03274ブラウズ

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 データが「content」フィールド内にネストされている場合、Retrofit はデフォルトで JSON 応答全体を「status」フィールドと「reason」フィールドを含む POJO に逆シリアル化しますが、実際のフィールドはそうではありません対象のデータ。

カスタマイズデシリアライゼーション:

ネストされたコンテンツ フィールドを自動的に抽出するには、Gson:

Content POJO:

Define を使用してカスタム デシリアライザーを作成できます。ネストされたデータを表す POJO クラス。 as:

class Content {
    public int foo;
    public String bar;
}

デシリアライザー:

JsonDeserializer を実装するこれは、JSON 応答から「content」要素を抽出し、Content POJO に逆シリアル化します。

class MyDeserializer implements JsonDeserializer<Content> {
    @Override
    public Content deserialize(...) {
        JsonElement content = je.getAsJsonObject().get("content");
        return new Gson().fromJson(content, Content.class);
    }
}

Gson Configuration:

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);
    }
}

コンテンツごとにこのデシリアライザーのインスタンスを登録します

Retrofit Integration:

カスタマイズされた Gson インスタンスを Retrofit ビルダーに渡します:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(url)
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build();

この設定により、Retrofit は自動的に実行されます。 「コンテンツ」フィールドを抽出して適切な POJO に解析するため、手動でフィールドを抽出する必要がなくなります。

以上がRetrofit と Gson を使用してネストされた JSON データを効率的に抽出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。