Jackson: So fügen Sie benutzerdefinierte Eigenschaften zu JSON hinzu, ohne das POJO zu ändern
Ich bin die Entwicklung einer REST-Schnittstelle für meine app mit Jackson zu serialisieren mein POJO domain-Objekte für JSON-Darstellung. Ich möchte zum anpassen der Serialisierung für einige Arten, zum hinzufügen von zusätzlichen Eigenschaften, um die JSON-Darstellung, die nicht in POJOs (z.B. hinzufügen von Metadaten, Referenzdaten, etc). Ich weiß, wie das schreiben meiner eigenen JsonSerializer
aber in diesem Fall würde ich explizit nennen JsonGenerator.writeXXX(..)
Methoden für jeder Eigenschaft des Objekts, während alle, die ich brauchen, ist nur zu hinzufügen eine zusätzliche Eigenschaft. In anderen Worten, ich würde gerne in der Lage, etwas zu schreiben wie:
@Override
public void serialize(TaxonomyNode value, JsonGenerator jgen, SerializerProvider provider) {
jgen.writeStartObject();
jgen.writeAllFields(value); //<-- The method I'd like to have
jgen.writeObjectField("my_extra_field", "some data");
jgen.writeEndObject();
}
oder (noch besser) irgendwie abfangen der Serialisierung vor der jgen.writeEndObject()
nennen, z.B.:
@Override void beforeEndObject(....) {
jgen.writeObjectField("my_extra_field", "some data");
}
Dachte ich, ich könnte verlängern BeanSerializer
und überschreiben Sie die serialize(..)
Methode, sondern es erklärt final
und auch ich konnte nicht finden eine einfache Möglichkeit zum erstellen einer neuen Instanz von BeanSerializer
ohne die es mit aller Art von Metadaten details praktisch duplizieren einen guten Teil von Jackson. Also ich hab aufgegeben, das zu tun.
Meine Frage ist - wie anpassen Jackson ' s Serialisierung, um zusätzliche Sachen, um die JSON-Ausgabe für bestimmte POJOs, ohne dabei zu viel boilerplate-code und die Wiederverwendung von so viel wie möglich von der Standard-Jackson-Verhalten.
InformationsquelleAutor der Frage Alex Vayda | 2013-02-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seit (ich glaube) Jackson 1.7 Sie können dies tun, mit einem
BeanSerializerModifier
und ErweiterungBeanSerializerBase
. Getestet hab ich das Beispiel unten mit Jackson 2.0.4.InformationsquelleAutor der Antwort ryanp
Jackson 2.5 eingeführt, der
@JsonAppend
annotation, die können verwendet werden, um "virtuelle" Eigenschaften während der Serialisierung. Es kann verwendet werden, mit der mixin-Funktionalität zu vermeiden, die eine änderung der ursprünglichen POJO.Im folgenden Beispiel wird ein
ApprovalState
- Eigenschaft während der Serialisierung:Registrieren Mixins mit der
ObjectMapper
:Verwenden Sie ein
ObjectWriter
um das Attribut zu setzen, die während der Serialisierung:Verwenden die Verfasser für die Serialisierung wird das
ApprovalState
Feld zum Ausgang.InformationsquelleAutor der Antwort Henrik
Können Sie dies tun (Vorherige version funktionierte nicht mit Jackson nach 2,6, aber das funktioniert mit Jackson 2.7.3):
InformationsquelleAutor der Antwort Rasmus Faber
Obwohl diese Frage bereits beantwortet, ich fand einen anderen Weg, dass erfordert keine speziellen Jackson Haken.
Ausgänge:
Für das schreiben von Sammlungen, können Sie einfach einen Blick:
Ausgabe:
InformationsquelleAutor der Antwort DieterDP
Können wir reflektion verwenden, um alle Felder des Objekts, das Sie wollen, zu analysieren.
In benutzerdefinierte serializer, wir haben unsere serialize-Methode wie diese :
InformationsquelleAutor der Antwort Sourabh
Inspiriert von dem, was Wajda verfilmt gesagt und geschrieben ist, in diesem gist:
Hier ist, wie Sie einen listener für bean-Serialisierung in jackson 1.9.12. In diesem Beispiel wird der listerner ist als eine Kette Von Befehl, die Schnittstelle ist :
MyBeanSerializer.java:
MyBeanSerializerBuilder.java:
MyBeanSerializerFactory.java:
Den letzten Kurs zeigt, wie man es mit Resteasy 3.0.7:
InformationsquelleAutor der Antwort Charlouze
Verlängern wir
BeanSerializer
aber mit einem kleinen trick.Definieren Sie zuerst eine java-Klasse, wrapper-Ihre POJO.
Dann,Umsetzung Ihrer benutzerdefinierten
serializer
.Diese Weise können wir den Fall behandeln, dass die origin-Objekt mit jackson Anmerkungen zu benutzerdefinierten Serialisierung Verhalten.
InformationsquelleAutor der Antwort smartwjw
Anderen und vielleicht die einfache Lösung:
Machen serialisieren einer 2-Schritt-Prozess. Erstellen Sie zuerst eine
Map<String,Object>
wie:fügen Sie dann die Eigenschaften, die Sie wollen, wie:
dann serialise diese zu json:
InformationsquelleAutor der Antwort Scheintod
Für meinen use-case, die ich verwenden könnte, einen viel einfacheren Weg. In der base-Klasse, ich habe für alle meine "Jackson Pojos" ich füge hinzu:
Kann ich jetzt Deserialisieren zu Pojo, arbeiten mit Feldern und reserialize witjout Verlust Eigenschaften. Ich kann auch hinzufügen/ändern nicht pojo-Eigenschaften:
(Habe es von Cowtowncoder)
InformationsquelleAutor der Antwort Brimstedt
Nachdem wir uns mehr auf die Jackson source-code habe ich festgestellt, dass es einfach unmöglich zu erreichen, ohne das schreiben meiner eigenen
BeanSerializer
BeanSerializerBuilder
undBeanSerializerFactory
und bieten einige Punkte, wie die Erweiterung:Leider musste ich kopieren und einfügen gesamte Jackson's
BeanSerializer
QuellcodeMyCustomBeanSerializer
weil der erstere ist nicht für Erweiterungen deklarieren Sie alle Felder und einige wichtige Methoden (wieserialize(...)
)final
InformationsquelleAutor der Antwort Alex Vayda
Brauchte ich diese Fähigkeit als gut, in meinem Fall, zur Unterstützung der Feld-Erweiterung auf REST-Dienste. Ich landete Entwicklung eines kleinen Rahmens um dieses problem zu lösen, und es ist als open Source auf github. Es ist auch in der maven central repository.
Er kümmert sich um alle arbeiten. Einfach wickeln Sie das POJO in eine MorphedResult, und dann hinzufügen oder entfernen von Eigenschaften auf. Wenn Sie serialisiert, die MorphedResult wrapper verschwindet und jegliche 'änderungen' in der serialisierten JSON-Objekt.
Siehe die github-Seite für weitere details und Beispiele. Werden Sie sicher, dass Sie zum registrieren der Bibliotheken 'filter' mit Jacksons object mapper wie so:
InformationsquelleAutor der Antwort allenru