Serialization Jackson注释:JsonIgnoreProperties(ignoreUnknown=true)和JsonInclude(Include.NON_EMPTY)之间的差异
我很好奇,Jackson注释@JsonIgnoreProperties(ignoreUnknown=true)和@JsonInclude(Include.NON_EMPTY)在类级别上有什么区别吗?一个只是另一个的更新版本吗?谢谢 缔约国指出: ignoreUnknown属性,定义是否可以忽略 反序列化期间任何无法识别的属性 这与空属性相同吗?简短回答:Serialization Jackson注释:JsonIgnoreProperties(ignoreUnknown=true)和JsonInclude(Include.NON_EMPTY)之间的差异,serialization,jackson,deserialization,Serialization,Jackson,Deserialization,我很好奇,Jackson注释@JsonIgnoreProperties(ignoreUnknown=true)和@JsonInclude(Include.NON_EMPTY)在类级别上有什么区别吗?一个只是另一个的更新版本吗?谢谢 缔约国指出: ignoreUnknown属性,定义是否可以忽略 反序列化期间任何无法识别的属性 这与空属性相同吗?简短回答: @JsonIgnoreProperties(ignoreUnknown=true)仅适用于将JSON反序列化为Java对象(POJO)。如果您
@JsonIgnoreProperties(ignoreUnknown=true)
仅适用于将JSON反序列化为Java对象(POJO
)。如果您的POJO不包含JSON确实包含的某些属性,那么将忽略它们,并且不会抛出任何错误@JsonInclude(Include.NON_EMPTY)
用于将POJO序列化为JSON,它表示跳过以下POJO属性:
不包括null或被视为空的内容。定义
空是特定于数据类型的
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"}
但是如果用@JsonInclude(Include.NON_EMPTY)
注释Person
,则从输出中忽略middleName
,因为其值为“空”(null
):
控制台输出为:{“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)
将产生无法识别的属性异常
异常:
线程“main”中出现异常
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:
无法识别的字段“middleName”
因为属性middleName
不属于Person
类
但是如果用@JsonIgnoreProperties(ignoreUnknown=true)
注释类Person
,则在反序列化到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 u = new User();
System.out.println(mapper.writeValueAsString(u));
控制台输出:
{
"login":"simpsonh",
"firstName":"Homer",
"middleName":"Jay",
"lastName":"Simpson"
}
多好的回答啊。谢谢你这么彻底!有趣的是,他们决定使用JsonInclude的名称将其从结果json中排除name@Sebastian-像这样读取->反序列化时,仅包括非空字段。
{
"login":"simpsonh",
"firstName":"Homer",
"middleName":"Jay",
"lastName":"Simpson"
}