Heim >Java >javaLernprogramm >Wie kann ich verschachtelte JSON-Daten mit Retrofit und Gson effizient extrahieren?

Wie kann ich verschachtelte JSON-Daten mit Retrofit und Gson effizient extrahieren?

Barbara Streisand
Barbara StreisandOriginal
2024-11-19 17:36:03314Durchsuche

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

Geschachteltes JSON-Objekt mit GSON mithilfe von Retrofit abrufen

Problemübersicht:

Beim Konsumieren eines API mit JSON-Antworten, strukturiert wie:

{
    'status': 'OK',
    'reason': 'Everything was fine',
    'content': {
         < some data here >
}

wo sich die gewünschten POJO-Daten befinden Im Feld „Inhalt“ verschachtelt, deserialisiert Retrofit standardmäßig die gesamte JSON-Antwort in ein POJO mit den Feldern „Status“ und „Grund“, jedoch nicht mit den eigentlichen Daten von Interesse.

Deserialisierung anpassen:

Um das verschachtelte Inhaltsfeld automatisch zu extrahieren, können Sie mit einen benutzerdefinierten Deserialisierer erstellen Gson:

Content POJO:

Definieren Sie eine POJO-Klasse, die die verschachtelten Daten darstellt, wie zum Beispiel:

class Content {
    public int foo;
    public String bar;
}

Deserializer:

Implementieren Sie a JsonDeserializer das das „content“-Element aus der JSON-Antwort extrahiert und es in das Content-POJO deserialisiert:

class MyDeserializer implements JsonDeserializer<Content> {
    @Override
    public Content deserialize(...) {
        JsonElement content = je.getAsJsonObject().get("content");
        return new Gson().fromJson(content, Content.class);
    }
}

Gson-Konfiguration:

Erstellen Sie eine Gson-Instanz mit GsonBuilder, Registrieren des benutzerdefinierten Deserialisierers:

Gson gson = new GsonBuilder()
    .registerTypeAdapter(Content.class, new MyDeserializer())
    .create();

Erweiterter Deserialisierer für mehrere Typen:

Wenn Sie mehrere Nachrichtentypen mit „Inhalt“-Feldern haben, können Sie den Deserialisierer wie folgt verallgemeinern:

class MyDeserializer<T> implements JsonDeserializer<T> {
    @Override
    public T deserialize(...) {
        JsonElement content = je.getAsJsonObject().get("content");
        return new Gson().fromJson(content, type);
    }
}

Registrieren Sie eine Instanz dieses Deserialisierers für jeden Ihrer Inhaltstypen.

Retrofit-Integration:

Bestehen Sie die angepasste Gson-Instanz an den Retrofit-Builder:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(url)
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build();

Mit diesem Setup extrahiert Retrofit nun automatisch das Feld „Inhalt“ und analysiert es in das entsprechende POJO, sodass keine manuelle Feldextraktion erforderlich ist.

Das obige ist der detaillierte Inhalt vonWie kann ich verschachtelte JSON-Daten mit Retrofit und Gson effizient extrahieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn