2017-08-20 1 views
2

Jungs! Ich entwickle eine Webanwendung und entschied mich, Jackson als meinen JSON-Verarbeitungsrahmen zu verwenden.Jackson's @JsonAppend mit Standardwert

In Anfrage Daten, die ich bereit bin zu senden; sagen wir mal, die POJO wie folgt aussieht:

{ 
    "obj1":{...}, 
    "obj2":{...} 
} 

aber ich muss hinzufügen, einige Metadaten zu diesem Objekt, sagen wir mal Felder meta1 und meta:

data class JSONEnvelope(
     @JsonProperty("obj1") 
     val obj1: Obj1, 

     @JsonProperty("obj2") 
     val obj2: Obj2) 

die wie folgt serialisiert erhalten. Ich dachte, dass @JsonAppend mein Problem lösen würde, aber ich benutze Jackson zusammen mit Jersey, also bin ich nicht Serialisierung von Objekten manuell, so dass ich writer.withAttribute("...", ...) nicht verwenden kann.

Ich bin bewusst, this thread, aber es gibt keine Antwort, die irgendwie meine Bedürfnisse erfüllen, weil ich denke, dass das Schreiben eines benutzerdefinierten Serialisierer ist ein bisschen Overkill dafür, auch wenn ich keinen Mechanismus haben, um den Rest zu serialisieren des ursprünglichen Objekts ". Ich würde mich für irgendwelche Ideen freuen

+0

In diesem Zusammenhang, was meinst du mit "Metadaten"? Könnte es als einfache berechnete Eigenschaften implementiert werden, die Jackson auf die normale Weise abbildet? –

+0

@PaulHicks Unter Metadaten verstehe ich zusätzliche Felder, da dieses Objekt das Root-Objekt ist und Remote-API zum Beispiel die angegebene JSON-Version benötigt, daher würde ich gerne das Feld '" jsonrpc ":" 2.0 "' hinzufügen. Ja, ich kann es der Klasse als Feld hinzufügen, aber ich denke, dass es nicht dorthin gehört, da diese Information nicht Teil des Status der Entität ist. Ich weiß nicht, was Sie mit berechneten Eigenschaften meinen –

+0

Berechnete Eigenschaften sind einfach diejenigen ohne Setzer (oder wo der Setzer nichts tut); zum Beispiel, 'val jsonrpc =" 2.0 "' oder 'var time = Date(). getTime()'. Einige Eigenschaften wären für eine Umschlagklasse geeignet. Wenn Sie 'JSONEnvelope' nicht ändern, scheint JsonAppend die beste Option zu sein. Wenn Sie den ObjectWriter nach dem Aufruf von 'ObjectMapper.writerFor' nicht ändern können, müssen Sie dies vorher tun, indem Sie die' writerFor'-Methode in einem von Ihnen angegebenen ObjectMapper mit '@ Provider' überschreiben. –

Antwort

0

Die Lösung in the answer you cited, die ein MixIn einem ObjectMapper fügt dann verwendet den ObjectWriter, um es zu konfigurieren, ist eine gute Lösung.

Für Jersey, die ObjectMapper.writerFor nennt und damit verhindert, dass Sie rufen withAttribute um die ObjectWriter zu konfigurieren, eine Alternative ist das Attribut auf den ObjectWriter vor es von writerFor Rückkehr hinzuzufügen. Ich empfehle Subclassing ObjectMapper und Überschreiben der verschiedenen WriterFor-Methoden, das Hinzufügen des erforderlichen Attributs an diesem Punkt. Sie können dann Jersey dazu bringen, diesen ObjectMapper zu verwenden, indem Sie ihn als JAX-RS-Provider registrieren: Sehen Sie sich die verschiedenen Anmerkungen in javax.ws.rs an, um damit anzufangen. This answer gibt ein Beispiel, was zu tun ist.