In modernen Anwendungen stößt man häufig auf API-Antworten mit verschachtelten JSON-Strukturen. Dies kann zu Herausforderungen führen, wenn Sie mit bestimmten Datenfeldern innerhalb der verschachtelten Hierarchie arbeiten möchten. In dieser Anleitung wird gezeigt, wie Sie einen benutzerdefinierten Gson-Deserialisierer erstellen, um mithilfe von Retrofit den gewünschten Inhalt aus verschachtelten JSON-Objekten zu extrahieren.
Betrachten Sie eine API-Antwort mit der folgenden Struktur:
{ 'status': 'OK', 'reason': 'Everything was fine', 'content': { < real data here > } }
Sie haben POJOs mit Status- und Grundfeldern, aber die Daten, die Sie benötigen, befinden sich im verschachtelten Inhalt Objekt.
Um den verschachtelten Inhalt zu extrahieren, erstellen Sie einen benutzerdefinierten Deserialisierer, der den eigentlichen POJO-Deserialisierer umschließt. So funktioniert es:
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();
Jetzt können Sie Ihre API-Antworten deserialisieren und mit Retrofit direkt als Inhaltsobjekte auf den verschachtelten Inhalt zugreifen.
Wenn Sie über mehrere Nachrichtentypen verfügen, die sich ein „Inhalt“-Feld teilen, können Sie einen generischen Deserialisierer erstellen folgt:
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); } }
Registrieren Sie diesen Deserialisierer für jeden Ihrer Inhaltstypen. Retrofit verwendet automatisch den entsprechenden Deserialisierer basierend auf der Art der API-Antwort.
Das obige ist der detaillierte Inhalt vonWie extrahiere ich verschachtelte JSON-Objekte aus API-Antworten mit Gson und Retrofit?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!