Ich versuche, ein JSON-Array mit GSON deserialisieren. Alle meine verschachtelten Objekte sind in einem "eingebetteten" Objekt eingebettet.GSON: Entfernen Sie unnötiges übergeordnetes Objekt beim Deserialisieren
{
"Book": {
"name": "Book 1",
"published": 1999,
"links": {
"url": "www.book1.com"
},
"embedded": {
"Author": {
"name": "John Doe",
"links": {
"url": "www.johndoe.com"
}
}
}
}
}
Ich könnte auch eine Situation wie diese haben:
{
"Book": {
"name": "Book 1",
"published": 1999,
"links": {
"url": "www.book1.com"
},
"embedded": {
"Publisher": {
"name": "Publishing Company",
"links": {
"url": "www.publishingcompany.com"
}
}
}
}
}
Dies ist ein äußerst einfaches Beispiel. Einige meiner Objekte können 2 oder 3 Ebenen tief verschachtelt sein, und alle sind in einem "eingebetteten" Objekt. Außerdem hat jedes Objekt eine verschachtelte "URL" in einem "Links" -Objekt. Ich habe ungefähr 20 verschiedene Modellobjekte, jedes mit mehreren Feldern, und jedes von ihnen hat das "eingebettete" Objekt. Ich fing an, für jedes Modell benutzerdefinierte Deserialisierer zu schreiben, aber das scheint den ganzen Punkt der Verwendung von gson zu verfehlen, und ich weiß vielleicht nicht immer, was das eingebettete Objekt ist.
Ich fand diese answer, aber es war für die Serialisierung von Objekten. Ich habe schon eine Weile versucht, das herauszufinden, und habe nichts gefunden, was funktioniert.
My Book Modell sieht wie folgt aus:
public class Book {
String name;
int published;
String url;
Author author;
Publisher publisher;
}
Autor Klasse:
public class Author {
String name;
String url;
}
Verlag Klasse:
public class Publisher {
String name;
String url;
}
Und hier ist mein Buch Deserializer so weit:
public class BookDeserializer implements JsonDeserializer<Book> {
@Override
public Book deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
final JsonObject jsonObject = json.getAsJsonObject();
Book book = new Book();
book.setName(jsonObject.get("name").getAsString());
book.setPublished(jsonObject.get("published").getAsInt());
String url = jsonObject.getAsJsonObject("links").get("url").getAsString();
book.setUrl(url);
// 1) How to get rid of this and skip to the "real" nested object?
final JsonObject embeddedObject = jsonObject.getAsJsonObject("embedded");
// 2) See what the "embedded" object actually is.
String embeddedModel;
Set<Map.Entry<String, JsonElement>> entrySet = embeddedObject.entrySet();
for (Map.Entry<String, JsonElement> entry : entrySet) {
// Author or Publisher
embeddedModel = entry.getKey();
}
// We have the model's key, now add code here to deserialize whatever the object is
return book;
}
}
Ich muss immer noch den JSON analysieren und jedes Feld für Buch festlegen. Dann müsste ich Code hinzufügen, um den korrekten Deserializer für das verschachtelte Objekt zu ermitteln und zu verwenden. Sieht so aus, als würde ich noch einen benutzerdefinierten Deserializer für jedes Objekt benötigen, um die "URL" zu erhalten. Ich bin ziemlich neu zu Gson, also vielleicht gibt es gerade etwas, das ich übersehe, aber es scheint, dass ich ebensogut manuell alle JSON analysieren und nicht einmal Gson verwenden könnte. Vielleicht gibt es eine Möglichkeit, Json zu verflachen?
Irgendwelche Ideen, wie dies zu analysieren und noch die Bequemlichkeit von Gson verwenden, oder ist das überhaupt möglich? Vielleicht könnte Jackson damit besser umgehen?
Cant Gson deserialize und serialisieren dies standardmäßig? Warum musst du dein eigenes schreiben? – user489041