2016-08-17 275 views

回答

10

簡短的回答:

  1. @JsonIgnoreProperties(ignoreUnknown=true)適用於JSON的反序列化到只有Java對象(POJO)。如果POJO不包含JSON包含的某些屬性,則它們將被忽略,並且不會引發錯誤。
  2. 在另一方面@JsonInclude(Include.NON_EMPTY)用於在POJO的序列化JSON和它說,跳過是POJO屬性:

    空或者什麼被認爲是空的不包括在內。 的定義空值是特定於數據類型的。

龍答:

@JsonInclude

是唯一的序列化時使用。它表示,如果某個屬性(或所有屬性)的值等於某個值(null,empty - 無論這意味着什麼,或默認值),則該屬性不會被序列化。

沒有這個註解屬性值總是被序列化。註釋有助於減少傳送屬性的數量(屬性默認值必須在接收端不存在時指定)。

實施例:

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)); 

會產生以下輸出:

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

但如果Person@JsonInclude(Include.NON_EMPTY)註釋,中間名從輸出省略,因爲它的值是在該 「空」(null情況):

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

控制檯輸出是:{"firstName":"Mark","lastName":"Watney"}

@JsonIgnoreProperties

是用來忽略串行化和反串行化的某些性質而不管其值:

,以防止指定字段從被序列化或反序列化(即不包含在JSON輸出中;或者被設置,即使它們包括):@JsonIgnoreProperties({ "internalId", "secretKey" })

要忽略JSON輸入任何未知屬性無一例外:@JsonIgnoreProperties(ignoreUnknown=true)

如果JSON輸入:

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

和類是:

public class Person { 
    public String firstName; 
    public String lastName; 
} 

反序列化mapper.readValue(json, Person.class)會產生UnrecognizedPropertyException例外:在線程 「主要」 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException

例外: 無法識別領域的 「中間名」 .....

因爲財產middleName不部分Person類。

但是,如果類Person註釋了@JsonIgnoreProperties(ignoreUnknown=true),則在向POJO反序列化時,未知屬性(如middleName)將被忽略。

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

另一種常見的情況是抑制敏感性質的系列化,例如像密碼:

@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"; 
} 

現在,如果你序列User類,密碼將在輸出時被省略:

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

控制檯輸出: {"login":"simpsonh","firstName":"Homer","middleName":"Jay","lastName":"Simpson"}

+0

Awesome answ呃,謝謝你這麼徹底! – discodude

+0

歡迎您:)! –