最新のアプリケーションでは、ネストされた JSON 構造を含む API 応答がよく見られます。これは、ネストされた階層内の特定のデータ フィールドを操作する場合に問題が発生する可能性があります。このガイドでは、カスタム Gson デシリアライザーを作成し、Retrofit を使用してネストされた JSON オブジェクトから目的のコンテンツを抽出する方法を説明します。
次の構造の API 応答を考えてみましょう:
{ 'status': 'OK', 'reason': 'Everything was fine', 'content': { < real data here > } }
ステータスフィールドと理由フィールドを含む POJO がありますが、必要なデータはネストされたコンテンツ内にありますobject.
ネストされたコンテンツを抽出するには、実際の POJO デシリアライザーをラップするカスタム デシリアライザーを作成します。その仕組みは次のとおりです:
class MyDeserializer implements JsonDeserializer<Content> { @Override public Content deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) { // Get the "content" element from the parsed JSON JsonElement content = je.getAsJsonObject().get("content"); // Deserialize it using a new Gson instance to avoid recursion return new Gson().fromJson(content, Content.class); } }
Gson gson = new GsonBuilder() .registerTypeAdapter(Content.class, new MyDeserializer()) .create();
Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create(gson)) .build();
これで、Retrofit を使用して API 応答を逆シリアル化し、ネストされたコンテンツに Content オブジェクトとして直接アクセスできるようになります。
「コンテンツ」フィールドを共有する複数のタイプのメッセージがある場合は、次のように汎用デシリアライザーを作成できます。
class MyDeserializer<T> implements JsonDeserializer<T> { @Override public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) { // Get the "content" element from the parsed JSON JsonElement content = je.getAsJsonObject().get("content"); // Deserialize it using a new Gson instance to prevent recursion return new Gson().fromJson(content, type); } }
コンテンツ タイプごとにこのデシリアライザーを登録します。 Retrofit は、API 応答のタイプに基づいて適切なデシリアライザーを自動的に使用します。
以上がGson と Retrofit を使用して API 応答からネストされた JSON オブジェクトを抽出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。