Deserialisieren von JSON mit Jackson in polymorphe Typen - Ein vollständiges Beispiel gibt mir einen Kompilierungsfehler
Ich bin versucht, Arbeit über ein tutorial vom Programmierer Bruce, soll ermöglichen, die Deserialisierung von polymorphen JSON.
Die komplette Liste kann hier gefunden werden
Programmierer Bruce tutorials (Great stuff btw)
Ich gearbeitet habe, durch die ersten fünf mit keine Probleme, aber ich habe getroffen einen Haken auf dem letzten (Beispiel 6), das ist natürlich die eine, die ich wirklich brauchen, um zu arbeiten.
Ich erhalte die folgende Fehlermeldung beim kompilieren
Die Methode readValue(JsonParser, Klasse) in der Art ObjectMapper ist nicht anwendbar für die Argumente (ObjectNode, Klasse)
und es ist verursacht durch das Stück code,
public Animal deserialize(
JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException
{
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
ObjectNode root = (ObjectNode) mapper.readTree(jp);
Class<? extends Animal> animalClass = null;
Iterator<Entry<String, JsonNode>> elementsIterator =
root.getFields();
while (elementsIterator.hasNext())
{
Entry<String, JsonNode> element=elementsIterator.next();
String name = element.getKey();
if (registry.containsKey(name))
{
animalClass = registry.get(name);
break;
}
}
if (animalClass == null) return null;
return mapper.readValue(root, animalClass);
}
}
Speziell durch die Linie
zurück mapper.readValue(root, animalClass);
Hat jemand diese vor und wenn ja, war es da eine Lösung?
Ich würde schätzen jede Hilfe, die jemand geben kann
Vielen Dank im Voraus
Jon D.
InformationsquelleAutor der Frage Jon Driscoll | 2015-05-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie versprochen, ich bin putting ein Beispiel dafür, wie mit Anmerkungen zum serialisieren/Deserialisieren von polymorphe Objekte, die ich auf dieser Beispiel in der
Animal
- Klasse aus dem tutorial Lesen.Zunächst Ihren
Animal
Klasse mit der Json-Anmerkungen für die Unterklassen.Dann Ihre Unterklassen
Dog
undCat
.Wie Sie sehen können, es ist nichts besonderes für
Cat
undDog
die einzige, die über Sie wissen, dieabstract
KlasseAnimal
so dass beim Deserialisieren, werden Sie ZielAnimal
und dieObjectMapper
zurück, die eigentliche Instanz, wie Sie sehen können, in den folgenden test:Ausgabe nach dem ausführen des
Test
Klasse:{"@type":"Dog","name":"ruffus","breed":"english shepherd"}
Deserialized dogJson Class: Dog
{"@type":"Cat","name":"goya","favoriteToy":"mice"}
Deserialized catJson Class: Cat
Hoffe, das hilft,
Jose Luis
InformationsquelleAutor der Antwort jbarrueta
Einfache Weise zu ermöglichen, polymorphe Serialisierung /Deserialisierung via Jackson-Bibliothek ist die weltweit konfigurieren Sie die Jackson-Objekt-mapper (jackson.databind-Methode.ObjectMapper), um Informationen hinzuzufügen, wie die konkrete Klasse Typ, für bestimmte Arten von Klassen, wie abstrakte Klassen.
Zu tun, so stellen Sie sicher, dass Ihr mapper richtig konfiguriert ist.
Zum Beispiel:
Option 1: Unterstützung polymorphe Serialisierung /Deserialisierung für abstrakte Klassen (und Objekt typisierten Klassen)
Option 2: Unterstützung polymorphe Serialisierung /Deserialisierung für abstrakte Klassen (und Objekt typisierten Klassen), und arrays von diesen Typen.
Referenz: http://wiki.fasterxml.com/JacksonPolymorphicDeserialization
InformationsquelleAutor der Antwort AmitW
Wenn Sie mit der fasterxml dann,
diese änderungen erforderlich werden könnten,
in der main-Methode--
verwenden
statt
sowie im Bereich der Deserialisieren () - Funktion, stellen Sie unter änderungen
Dies funktioniert für fasterxml.jackson. Wenn es immer noch meckert die Klasse Felder. Verwenden Sie das gleiche format wie json für den Feld-Namen (mit "_" -Unterstrich). als dieser
//mapper.setPropertyNamingStrategy(new CamelCaseNamingStrategy());
möglicherweise nicht unterstützt.
InformationsquelleAutor der Antwort ravi.zombie