Wie man eine Klasse mit überladenen Konstruktoren mit JsonCreator deserialisiert
Ich versuche zu Deserialisieren einer Instanz dieser Klasse verwenden Jackson 1.9.10:
public class Person {
@JsonCreator
public Person(@JsonProperty("name") String name,
@JsonProperty("age") int age) {
//... person with both name and age
}
@JsonCreator
public Person(@JsonProperty("name") String name) {
//... person with just a name
}
}
Wenn ich das bekomme ich folgende
Widersprüchliche Eigenschaft-basierten Schöpfer: schon hatte ... {interface org.codehaus.jackson.mit Anmerkungen versehen.JsonCreator @org.codehaus.jackson.mit Anmerkungen versehen.JsonCreator ()}] begegnet ... , Anmerkungen: {interface org.codehaus.jackson.mit Anmerkungen versehen.JsonCreator @org.codehaus.jackson.mit Anmerkungen versehen.JsonCreator()}]
Gibt es eine Möglichkeit zu Deserialisieren einer Klasse mit überladenen Konstruktoren mit Jackson?
Dank
InformationsquelleAutor der Frage geejay | 2013-04-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl seine nicht ordnungsgemäß dokumentiert ist, können Sie nur einen creator pro Typ. Sie können beliebig viele Konstruktoren, wie Sie in Ihrer Art, aber nur einer von Ihnen sollte eine
@JsonCreator
annotation.InformationsquelleAutor der Antwort Perception
Diese gelten immer noch für Jackson databind-2.7.0.
Jackson
@JsonCreator
annotation 2.5 javadoc oder Jackson Anmerkungen Dokumentation Grammatik (Konstruktors und factory-Methodes) lassen glauben, dass in der Tat kann man mark mehrere Konstruktoren.Blick auf den code, wo die Schöpfer identifiziert sind, sieht es aus wie die Jackson
CreatorCollector
ignoriert überladene Konstruktorenweil es nur prüft das erste argument des Konstruktors.oldOne
ist die erste identifizierte Konstruktor Schöpfer.newOne
ist der überladene Konstruktor Schöpfer.Das bedeutet, dass code wie nicht funktionieren
Aber dieser code funktioniert :
Das ist ein bisschen hacky und möglicherweise nicht zukunftssicher.
Die Dokumentation ist vage über Objekterstellung funktioniert; von dem, was ich sammeln, aus dem code ist es allerdings, dass es möglich ist ein mix aus unterschiedlichen Methoden :
Zum Beispiel kann man eine statische factory-Methode annotiert mit
@JsonCreator
Es funktioniert, aber es ist nicht ideal. Am Ende könnte es Sinn machen, z.B. wenn der json ist, dass dynamische dann vielleicht sollte man die Verwendung eines Delegaten-Konstruktor handle Nutzlast-Varianten viel mehr aus als mit mehreren annotierten Konstruktoren.
Beachten Sie auch, dass Jackson Bestellungen Schöpfer von Prioritätzum Beispiel in diesem code :
Dieser Zeit Jackson wird nicht ein Fehler, aber Jackson wird nur der delegieren Konstruktor
Phone(Map<String, Object> properties)
bedeutet, dass diePhone(@JsonProperty("value") String value)
ist nie benutzt.InformationsquelleAutor der Antwort Brice
Wenn ich direkt, was Sie versuchen zu erreichen, können Sie es lösen ohne eine Konstruktor-überladung.
Wenn Sie nur wollen, setzen Sie null-Werte in die Attribute nicht in einem JSON-oder eine Karte, die Sie tun können, die folgenden:
Das war mein Fall, wenn ich Ihre Frage. Es dauerte einige Zeit, um herauszufinden, wie es zu lösen, vielleicht ist das, was Sie waren tring zu tun.
@Brice-Lösung nicht für mich arbeiten.
InformationsquelleAutor der Antwort Tiago Stapenhorst Martins
Wenn es Ihnen nichts ausmacht dabei ein wenig mehr Arbeit, können Sie Deserialisieren der entity manuell:
InformationsquelleAutor der Antwort Crummy