Maison >Java >javaDidacticiel >Comment puis-je extraire efficacement des données JSON imbriquées à l'aide de Retrofit et Gson ?

Comment puis-je extraire efficacement des données JSON imbriquées à l'aide de Retrofit et Gson ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-19 17:36:03317parcourir

How Can I Efficiently Extract Nested JSON Data Using Retrofit and Gson?

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 qui extrait l'élément "content" de la réponse JSON et le désérialise dans le POJO Contenu :

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!

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