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); } }
Generic Deserializer for Different Content Types
メッセージの種類が異なる場合は、すべてが「コンテンツ」フィールドを共有しているため、汎用的なフィールドを作成できます。 deserializer:
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 中国語 Web サイトの他の関連記事を参照してください。