2016-08-17 1 views
3

Ich bin neugierig, gibt es einen Unterschied zwischen Jackson Annotationen @ JsonIgnoreProperties (ignoreUnknown = wahr) und @JsonInclude (Include.NON_EMPTY) in der Klasse Niveau? Ist man nur eine neuere Version des anderen? Vielen Dank!Jackson Annotations: Unterschied zwischen JsonIgnoreProperties (ignoreUnknown = true) und JsonInclude (Include.NON_EMPTY)

Der jackson docs heißt es:

ignoreUnknown Eigenschaft, die definiert, ob es in Ordnung ist, nur alle nicht erkannten Eigenschaften während der Deserialisierung zu ignorieren.

Ist das das Gleiche wie nur eine leere Eigenschaft?

Antwort

10

Kurze Antwort:

  1. @JsonIgnoreProperties(ignoreUnknown=true) ist anwendbar bei der Deserialisierung von JSON zu Java-Objekt (POJO) nur. Wenn Ihr POJO bestimmte Eigenschaften, die JSON enthält, nicht enthält, werden sie ignoriert und es wird kein Fehler ausgegeben.
  2. Auf der anderen Seite @JsonInclude(Include.NON_EMPTY) wird bei der Serialisierung von POJO zu JSON verwendet, und es sagt, POJO Eigenschaften überspringt, die:

    null oder was leer sind nicht inbegriffen in Betracht gezogen werden. Definition von Leere ist Datentyp spezifisch.

Lange Antwort:

@JsonInclude

Wird nur bei der Serialisierung Zeit verwendet. Wenn der Wert einer Eigenschaft (oder aller Eigenschaften) einem bestimmten Wert entspricht (null, empty - was auch immer das bedeutet, oder ein Standardwert), wird diese Eigenschaft nicht serialisiert.

Ohne diese Annotationseigenschaft wird der Wert immer serialisiert. Die Anmerkung hilft, die Anzahl der übertragenen Eigenschaften zu reduzieren (Der Standardwert für die Eigenschaft muss angegeben werden, wenn sie nicht auf der Empfangsseite vorhanden ist).

Beispiel:

public class Person { 
    public String firstName = "Mark"; 
    public String middleName; 
    public String lastName = "Watney"; 
} 

ObjectMapper mapper = new ObjectMapper(); 
Person p = new Person(); 
System.out.println(mapper.writeValueAsString(p)); 

folgende Ausgabe produzieren:

{"firstName":"Mark","middleName":null,"lastName":"Watney"} 

Aber wenn Person mit @JsonInclude(Include.NON_EMPTY) kommentiert, wird Middle aus der Ausgabe weggelassen, weil sein Wert "leer" (null in diesem Fall):

@JsonInclude(Include.NON_EMPTY) 
public static class Person { 
    [....] 
} 

Console Ausgabe ist: {"firstName":"Mark","lastName":"Watney"}

@JsonIgnoreProperties

bestimmte Eigenschaften in Serialisierung und Deserialisierung unabhängig von ihrer Werte zu ignorieren verwendet:

auf bestimmte Felder zu verhindern serialisiert oder deserialisiert wird (d.h. nicht in JSON-Ausgabe enthalten; oder eingestellt wird, auch wenn sie) enthalten waren: @JsonIgnoreProperties({ "internalId", "secretKey" })

Um alle unbekannten Eigenschaften in JSON Eingang ohne Ausnahme zu ignorieren: @JsonIgnoreProperties(ignoreUnknown=true)

Wenn JSON-Eingang:

{ 
    "firstName": "Homer", 
    "middleName": "Jay", 
    "lastName": "Simpson" 
} 

und Klasse ist:

Deserialisierung mapper.readValue(json, Person.class) wirdproduzierenAusnahme:

Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Nicht erkannte Feld "Middle" .....

Da Eigenschaft middleName nicht ist Teil von Person Klasse.

Wenn jedoch die Klasse Person mit @JsonIgnoreProperties(ignoreUnknown=true) annotiert wurde, werden unbekannte Eigenschaften (wie middleName) bei der Deserialisierung in POJO ignoriert.

@JsonIgnoreProperties(ignoreUnknown=true) 
public class person { 
    [...] 
} 

Ein weiterer häufiger Anwendungsfall ist die Serialisierung von sensiblen Eigenschaften zu unterdrücken, wie zum Beispiel Passwort:

@JsonIgnoreProperties("password") 
public static class User { 
    public String login = "simpsonh"; 
    public String password = "D00nut"; 
    public String firstName = "Homer"; 
    public String middleName = "Jay"; 
    public String lastName = "Simpson"; 
} 

Nun, wenn Sie Benutzer Klasse serialisiert wird Passwort von dem Ausgang weggelassen werden:

User u = new User(); 
System.out.println(mapper.writeValueAsString(u)); 

Konsolenausgabe: {"login":"simpsonh","firstName":"Homer","middleName":"Jay","lastName":"Simpson"}

+0

Super Antwort Danke, dass du so gründlich bist! – discodude

+0

Gern geschehen :)! –

Verwandte Themen