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.
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.
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 :
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();
Désérialisez vos réponses API et accédez directement au contenu imbriqué en tant qu'objets de contenu à l'aide de Retrofit.
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!