Obtenir un objet JSON imbriqué avec GSON à l'aide de Retrofit
Aperçu du problème :
Lors de la consommation d'un API avec des réponses JSON structurées comme :
{ 'status': 'OK', 'reason': 'Everything was fine', 'content': { < some data here > }
où les données POJO souhaitées sont imbriquées dans le champ "contenu", Retrofit désérialise par défaut l'intégralité de la réponse JSON dans un POJO avec les champs "statut" et "raison". , mais pas les données réelles qui vous intéressent.
Personnalisation de la désérialisation :
Pour extraire automatiquement le champ de contenu imbriqué, vous pouvez créer un désérialiseur personnalisé à l'aide de Gson :
Content POJO :
Définissez une classe POJO représentant les données imbriquées, telle que :
class Content { public int foo; public String bar; }
Désérialiseur :
Implémenter un JsonDeserializer
class MyDeserializer implements JsonDeserializer<Content> { @Override public Content deserialize(...) { JsonElement content = je.getAsJsonObject().get("content"); return new Gson().fromJson(content, Content.class); } }
Configuration Gson :
Créer une instance Gson avec GsonBuilder, enregistrement du désérialiseur personnalisé :
Gson gson = new GsonBuilder() .registerTypeAdapter(Content.class, new MyDeserializer()) .create();
Désérialiseur amélioré pour plusieurs types :
Si vous avez plusieurs types de messages avec des champs « contenu », vous pouvez généraliser le désérialiseur comme suit :
class MyDeserializer<T> implements JsonDeserializer<T> { @Override public T deserialize(...) { JsonElement content = je.getAsJsonObject().get("content"); return new Gson().fromJson(content, type); } }
Enregistrez une instance de ce désérialiseur pour chacun de vos types de contenu.
Intégration de mise à niveau :
Passez le Gson personnalisé instance au générateur Retrofit :
Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create(gson)) .build();
Avec cette configuration, Retrofit extraira désormais automatiquement le champ « contenu » et l'analysera dans le POJO approprié, éliminant ainsi le besoin d'extraction manuelle du champ.
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!