2017-01-12 5 views
0

Ich versuche, die Standard-Deserialisierung von Jackson zu erweitern, um den Feldern meines Domänenobjekts ein Platzhalterobjekt zuzuweisen, wenn sie im JSON explizit auf null gesetzt sind. Ich verwende Spring Boot + Spring Data. Ich habe viel nach dem besten Weg gesucht, um es zu tun, und ich glaube, dass ein kundenspezifischer Deserializer das ist, was ich will. Ich bin offen für Vorschläge dazu, aber meine eigentliche Frage ist, wie man die Standard-Deserialisierung verwendet und die expliziten Null-Zuweisungen selbst handhabt. Dies ist, wo ich bin stecken (in MyItemDeserializer):Verwenden Sie JsonParser erneut nach Deserialisierung

@Override 
public Item deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) 
     throws IOException, JsonProcessingException 
{ 
    Item item = (Item) defaultDeserializer.deserialize(jsonParser, deserializationContext); 
    JsonNode root = jsonParser.readValueAsTree(); 
    // traverse the tree to handle {"something":null} 
    return item; 
} 

Offensichtlich nach dem Standard-Deserializer verarbeitet, um das Objekt jsonParser readValueAsTree gibt null zurück. Gibt es eine Möglichkeit, den JSON nach der Standard-Deserialisierung als Baum (oder irgendetwas anderes) zu verwenden?

Antwort

1

Wenn ich Ihre Frage richtig verstanden hat, was würden Sie wollen, ist zu tun Art Umkehrung des Code, den Sie haben: Statt JsonParser wie aus vorbei, dann noch einmal zu lesen versuchen, Sie FIRST Inhalt lesen sollten, erstellen JsonParser aus sie, und diese Inhalte wiederverwenden.

Eine Möglichkeit ist, Inhalte wie JsonNode und konstruierten Parser com.fasterxml.jackson.databind.node.TreeTraversingParser zu lesen:

JsonParser p2 = new TreeTraversingParser(node); 
Item item = (Item) defaultDeserializer.deserialize(p2, deserializationContext); 

Eine weitere Möglichkeit zu lesen ist Inhalt als TokenBuffer und baut 2 Parser aus ihn heraus: das ist, was interner Code verwendet für Pufferung. Dies funktionieren würde so etwas wie:

TokenBuffer buf = new TokenBuffer(jsonParser); 
b.copyCurrentStructure(jsonParser); 
JsonParser p2 = buf.asParser(); // for default deserializer 
JsonParser p3 = buf.asParser(); // for further processing, read as tree, whatever 

obwohl ein Baum bauen, ist etwas umständlich in diesem Fall.

+0

Ich kannte TreeTraversingParser nicht. Vielen Dank! –

+0

Es ist Bit versteckt, und es könnte sinnvoll sein, es über eine Methode in 'JsonNode' oder etwas (" asParser() "oder so) zu offenbaren. – StaxMan

Verwandte Themen