Ich kann Json string-> Java object
in Jackson leicht konvertieren (deserialisieren), aber ich muss einige Eigenschaften als JSON-String erhalten.
Der Zweck besteht darin, eine magische Eigenschaft (hier vorübergehend als Nutzlast bezeichnet) zu haben, die alles aufnehmen kann, und sie mit dem in einer anderen Eigenschaft definierten Datentyp (FQCN) wiederherzustellen.
Jackson hat ein @ JsonValue, das JSON-Zeichenfolgen so behandelt, wie sie sind, dies gilt jedoch nur für die Serialisierung. Leider gilt es nicht für die Deserialisierung.
Die Problemumgehung besteht darin, Ihren eigenen "JsonDeserializer" zu implementieren und den Deserialisierungsprozess individuell mit "@ JsonDeserialize" anzugeben. Der Zweck ist jedoch "Ich möchte die JSON-Zeichenfolge so erhalten, wie sie ist", sodass die Implementierung von "JsonDeserializer" sehr einfach ist.
JsonRawValueDeserializer.java
package com.example.jacksondemo;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
//★ Punkt 1
public class JsonRawValueDeserializer extends JsonDeserializer<String> {
//★ Punkt 2
@Override
public String deserialize(JsonParser parser, DeserializationContext context)
throws IOException, JsonProcessingException {
return parser.readValueAsTree().toString();
}
}
MyModel.java
package com.example.jacksondemo;
import java.io.Serializable;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
public class MyModel implements Serializable {
private static final long serialVersionUID = 1L;
//★ Punkt 3
// I want json raw text!
@JsonDeserialize(using = JsonRawValueDeserializer.class)
private String payload;
// these property are auto mapped by jackson (without special operation)
private String fqcn;
private Integer priority;
private String messageId;
// constructor, setter, getter omitted
}
** ★ Punkt 1 ** Erben Sie die Klasse "com.fasterxml.jackson.databind.JsonDeserializer" und definieren Sie Ihren eigenen "JsonDeserializer". Geben Sie für den Typparameter den Typ des Ergebnisses des Deserialisierungsprozesses an, dh diesmal "String".
** ★ Punkt 2 ** Implementieren Sie diese Option, um die Methode "deserialize" zu überschreiben und eine JSON-Zeichenfolge zurückzugeben.
** ★ Punkt 3 **
Fügen Sie in der Java-Klasse, die JSON zuordnet, die Annotation @ JsonDeserialize
zu der Eigenschaft hinzu, für die Sie den Wert so zuordnen möchten, wie er ist.
Geben Sie den ursprünglichen "JsonDeserializer", der in Punkt 1 implementiert ist, im Attribut "using" an.
Selbst wenn die JSON-Eigenschaft payload
ein Objekt ist, wird diese JSON-Zeichenfolge so gespeichert, wie sie in der Eigenschaft Stringpayload
enthalten ist.
Um diesen Zweck zu erreichen, überprüfen Sie die Eigenschaft dqcn
, um den Datentyp zu identifizieren, und deserialisieren Sie dann den String-Wert der Eigenschaft payload
mit dem gewünschten Datentyp.
Dieses Mal erklärte ich, wie man einige Eigenschaften als JSON-Zeichenketten erhält, indem man Jackson deserialisiert. Jackson hat eine Funktion namens "JsonNode", die Json als baumstrukturierte Daten liest, aber ich denke, dass es viele Möglichkeiten gibt, Json und Java zuzuordnen. Wenn Sie zu diesem Zeitpunkt feststellen, dass nur bestimmte Eigenschaften als Json übrig bleiben, versuchen Sie diese Verwendung.
Recommended Posts