ignorieren unbekannte Felder über JSON-Objekte mit jackson
Ich bin mit jackson 2.x für die Serialisierung und Deserialisierung. Ich bin registriert, die objectMapper zu den Nachbrenner Modul und Konfiguration der Objekt-mapper ignorieren unbekannten Eigenschaften
objectMapper.registerModule(new AfterBurnerModule());
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
aber wenn es versucht, ein Objekt serialisieren es nicht mit unbekannten Feld gefunden, für die Attribut-Fehler
Java-Objekt annotiert mit @JsonIgnoreProperties(ignoreUnknown = true)
Kann jemand mir helfen zu verstehen, was vielleicht falsch läuft
Unten finden Sie die Util-Klasse
package example;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.AnnotationIntrospector;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import com.fasterxml.jackson.module.afterburner.AfterburnerModule;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
public final class Util {
private static ObjectMapper objectMapper;
static {
objectMapper = new ObjectMapper();
objectMapper.registerModule(new AfterburnerModule());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
objectMapper.setDateFormat(sdf);
objectMapper.setAnnotationIntrospector(AnnotationIntrospector.pair(new JaxbAnnotationIntrospector(objectMapper.getTypeFactory()), new JacksonAnnotationIntrospector()));
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setSerializationInclusion(Include.NON_NULL);
}
private Util() {
}
public static <T> T convertToObject(String jsonString,Class<T> classType){
T obj = null;
try {
obj = objectMapper.readValue(jsonString, classType);
} catch (Exception e) {
}
return obj;
}
public static String convertToString(Object obj)
throws IOException {
return objectMapper.writeValueAsString(obj);
}
}
enum-Klasse NumberEnum
package sample;
public enum NumberEnum {
ONE, TWO
}
Klasse A
package sample;
@JsonIgnoreProperties(ignoreUnknown = true)
public class A {
@JsonProperty
private NumberEnum number;
}
den code, wo ich bin Deserialisieren ist als unten
A a = Util.convertToObject(str, A.class);
und der string, den ich versuche zu deserailize ist wie folgt:
{
"number": "Num"
}
Unten ist der Fehler beim Deserialisieren:
com.fasterxml.jackson.databind-Methode.exc.InvalidFormatException: Kann nicht bauen Instanz der Probe.NumberEnum von der String-Wert 'Num': Wert nicht einer der deklarierten Enum-Instanz Namen: [EINS, ZWEI]
bei (durch die Referenz-Kette: Probe.["Ein"]->Probe.NumberEnum["Anzahl"])
die Klasse A ist importiert aus einem Glas und es ist mit jackson-Bibliothek 1.9
Hinzugefügt mehr details
InformationsquelleAutor java2890 | 2016-02-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
ignoreUnknown
gilt nur für Namen der Eigenschaft, die unbekannt sind, in das Ziel-Objekt. Zum Beispiel, wenn Sie hatte:Jackson würde normalerweise fehl, wenn das Objekt, das Sie versuchen zu Deserialisieren hatte keine setter/property mit dem Namen "foo".
Was Sie versuchen zu erreichen, ist etwas ganz anderes; die Eigenschaft ist bekannt, aber Sie sind zu meistern versucht, eine ungültige enum-Wert. Wenn Sie nur wollen, es zu Deserialisieren von unbekannten Werten als null ist, verwenden Sie
READ_UNKNOWN_ENUM_VALUES_AS_NULL
:Dies geschieht über mapper Konfiguration:
Hinweis: ich sah nur, dass Sie mit Jackson 1.9 und Deserialisierung dieser Funktion wurde veröffentlicht in 2.0. Wenn Sie ein Upgrade ist nicht eine option, müssen Sie möglicherweise erstellen Sie eine benutzerdefinierte deserializer für diese Eigenschaft, die nicht die gleiche Sache.
InformationsquelleAutor Mark Peters
Ich denke, dass das, was Sie brauchen, um zu Deserialisieren ist eigentlich json sieht wie folgt aus:
{
"number": "ONE"
}
- ODER -
{
"number": "TWO"
}
da "Num" ist nicht der name() entweder von den enums es wird nicht Deserialisieren
InformationsquelleAutor NW0428