Wie kann man Bohnen mit Jackson auf eigene Art instanziieren?

8

Was ist der beste und einfachste Weg, um Beans auf benutzerdefinierte Weise zu instanziieren (nicht durch Aufruf des Standardkonstruktors), während Sie aus JSON mithilfe der Jackson-Bibliothek deserialisieren? Ich fand, dass es JsonDeserializer interface gibt, das ich implementieren könnte, aber ich bin nicht sicher, wie man alles zusammen in ObjectMapper verbindet.

UPDATE # 1 : Ich denke, für meine Frage sind noch einige Details erforderlich. Standardmäßig verwendet Jacksons Deserializer den Standardkonstruktor, um Beans zu kretieren. Ich möchte in der Lage sein, Instanziierung der Bohne durch den Aufruf externer Fabrik zu implementieren. Was ich brauche, ist nur eine Klasse der Bohne, die instanziiert werden muss. Die Fabrik wird eine Instanz zurückgeben, die dann Jackson für die Immobilienpopulation usw. zur Verfügung gestellt wird.

Bitte beachten Sie, dass mir die Erstellung von einfachen / skalaren Werten wie Strings oder Zahlen nicht wichtig ist, nur die Beans liegen in meinem Interessensgebiet.

    
Tomasz Błachowicz 18.04.2011, 08:27
quelle

2 Antworten

8

Einige Dinge, die helfen können ...

Zuerst können Sie @JsonCreator verwenden, um alternative Konstruktoren zu definieren (alle Argumente müssen mit @JsonProperty annotiert werden, da Bytecode keine Namen hat) oder eine statische Factory. Es wäre immer noch Teil der Wertklasse, kann aber dazu beitragen, unveränderliche Objekte zu unterstützen.

Zweitens: Wenn Sie einen wirklich benutzerdefinierten Deserialisierungsprozess wünschen, können Sie Ссылка auschecken, in dem erklärt wird, wie Sie benutzerdefinierte Deserializer registrieren.

p>

Eine Sache, die Jackson derzeit vermisst, ist die Unterstützung von Objekten im Builder-Stil; Es gibt eine Feature-Anforderung zum Hinzufügen von Unterstützung (und es ist geplant, in Zukunft Unterstützung hinzuzufügen, sobald Entwickler Zeit haben).

    
StaxMan 18.04.2011 22:53
quelle
0

Sie setzen den Deserializer auf das Java-Objekt, auf das Sie den JSON mappen möchten:

%Vor%

und dann können Sie im Deserializer z. tu:

%Vor%

Wenn Sie keine Anmerkungen verwenden möchten, müssen Sie dem Mapper ein DeserializerProvider übergeben, das den richtigen Deserializer für einen bestimmten Typ bereitstellen kann.

%Vor%

Für die Konstruktoren - natürlich können Sie die Zielklasse generieren, indem Sie eine Factory im Deserializer aufrufen:

%Vor%

Aber dann habe ich vielleicht Ihr Update falsch verstanden

    
Heiko Rupp 18.04.2011 08:46
quelle

Tags und Links