Maison > Java > javaDidacticiel > le corps du texte

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

Barbara Streisand
Libérer: 2024-11-19 17:36:03
original
263 Les gens l'ont consulté

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 >
}
Copier après la connexion

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;
}
Copier après la connexion

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);
    }
}
Copier après la connexion

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();
Copier après la connexion

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);
    }
}
Copier après la connexion

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();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal