Maison  >  Article  >  Java  >  Comment extraire des objets JSON imbriqués des réponses API à l'aide de Gson et Retrofit ?

Comment extraire des objets JSON imbriqués des réponses API à l'aide de Gson et Retrofit ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-19 04:26:02626parcourir

How to Extract Nested JSON Objects from API Responses using Gson and Retrofit?

Extraction d'objets JSON imbriqués à l'aide de Gson et Retrofit

Dans les applications modernes, il est courant de rencontrer des réponses API avec des structures JSON imbriquées. Cela peut poser des problèmes lorsque vous souhaitez travailler avec des champs de données spécifiques au sein de la hiérarchie imbriquée. Ce guide montrera comment créer un désérialiseur Gson personnalisé pour extraire le contenu souhaité des objets JSON imbriqués à l'aide de Retrofit.

Énoncé du problème

Considérez une réponse API avec la structure suivante :

{
  'status': 'OK',
  'reason': 'Everything was fine',
  'content': {
    < real data here >
  }
}

Vous avez des POJO avec des champs de statut et de motif, mais les données dont vous avez besoin résident dans le contenu imbriqué object.

Solution

Pour extraire le contenu imbriqué, vous allez créer un désérialiseur personnalisé qui enveloppe le désérialiseur POJO réel. Voici comment cela fonctionne :

  1. Créez un POJO de contenu : Définissez un POJO pour représenter les données de contenu imbriquées.
  2. Implémentez un désérialiseur : Créer un désérialiseur qui extrait le contenu champ :
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);
  }
}
  1. Enregistrez le désérialiseur : Configurez Gson avec votre désérialiseur personnalisé :
Gson gson = new GsonBuilder()
  .registerTypeAdapter(Content.class, new MyDeserializer())
  .create();
  1. Utiliser Retrofit avec un convertisseur personnalisé : Créez une instance Retrofit à l'aide du fichier modifié Gson :
Retrofit retrofit = new Retrofit.Builder()
  .baseUrl(url)
  .addConverterFactory(GsonConverterFactory.create(gson))
  .build();

Désérialisez vos réponses API et accédez directement au contenu imbriqué en tant qu'objets de contenu à l'aide de Retrofit.

Désérialiseur générique pour plusieurs types

Si vous avez plusieurs types de messages partageant un champ « contenu », vous pouvez créer un désérialiseur générique comme suit :

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

Enregistrez ce désérialiseur pour chacun de vos types de contenu. Retrofit utilisera automatiquement le désérialiseur approprié en fonction du type de réponse API.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn