2016-08-17 279 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

欢迎您:)! –