Extraction de JSON imbriqué avec un convertisseur Gson personnalisé dans Retrofit
De nombreuses API fournissent des réponses avec une structure JSON commune où un objet racine englobe un objet imbriqué champ "content" contenant les données souhaitées. Cependant, la plupart des POJO modélisent uniquement les données contenues dans le champ « contenu », laissant l'adaptateur de type de mise à niveau incapable d'extraire et de renvoyer l'objet approprié.
Pour résoudre ce problème, un désérialiseur Gson personnalisé peut être développé pour extraire le " content" et renvoie l'objet incorporé. Voici comment :
Désérialiseur personnalisé :
Créez une classe implémentant l'interface JsonDeserializer pour le type POJO souhaité. Par exemple, pour un POJO « Contenu » :
class ContentDeserializer implements JsonDeserializer<Content> { @Override public Content deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException { // Extract the "content" element JsonElement content = je.getAsJsonObject().get("content"); // Deserialize the content using a new Gson instance return new Gson().fromJson(content, Content.class); } }
Configuration Gson :
Enregistrez le désérialiseur personnalisé avec une instance GsonBuilder :
Gson gson = new GsonBuilder() .registerTypeAdapter(Content.class, new ContentDeserializer()) .create();
Cette instance Gson peut désormais être utilisée pour désérialiser les réponses JSON directement dans l'objet "Contenu" intégré.
Intégration Retrofit :
Enfin, utilisez le convertisseur Gson personnalisé lors de la création de l'instance Retrofit :
Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create(gson)) .build();
Désormais, lorsque Retrofit désérialise les réponses de l'API, il utilisera le convertisseur personnalisé pour extraire uniquement le champ « contenu » et renvoyer le type POJO approprié.
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!