场景:实体类中的某个字段为特定值/空的话,就不需要序列化该字段保存到xml文件中。
@JsonInclude用法:
JsonInclude.Include.ALWAYS 这个是默认策略,任何情况下都序列化该字段,和不写这个注解是一样的效果。
JsonInclude.Include.NON_NULL 这个最常用,即如果加该注解的字段为null,那么就不序列化这个字段了。
JsonInclude.Include.NON_ABSENT 这个包含NON_NULL,即为null的时候不序列化,详情看源码。
JsonInclude.Include.NON_EMPTY 这个属性包含NON_NULL,NON_ABSENT之后还包含如果字段为空也不序列化。
JsonInclude.Include.NON_DEFAULT 这个属性是如果该字段为默认值的话就不序列化。
JsonInclude.Include.USE_DEFAULTS 使用默认值的情况下就不序列化。
JsonInclude.Include.CUSTOM 这个是自定义包含规则,官方的解释如下:
如果使用@JsonInclude#value=JsonInclude.Include.CUSTOM并通过@JsonInclude#value filter指定一个筛选器类,则仅当该属性值未被筛选器类筛选时,才会对其进行序列化。filter类的equals()方法用于筛选值;如果返回“true”,则不序列化值。
类似地,如果使用@JsonInclude#content=JsonInclude.Include.CUSTOM并通过@JsonInclude#content filter指定筛选器类,则如果筛选器类的equals方法返回true,则不会序列化目标属性的内容值。
注:fasterxml.jackson的相关版本2.8不支持,小编使用的是2.10version
Example
package com.logicbig.example;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.util.Date;
import java.util.Map;
public class Employee {
private String name;
@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = DateOfBirthFilter.class)
private Date dateOfBirth;
@JsonInclude(content = JsonInclude.Include.CUSTOM, contentFilter = PhoneFilter.class)
private Map<String, String> phones;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
public Map<String, String> getPhones() {
return phones;
}
public void setPhones(Map<String, String> phones) {
this.phones = phones;
}
}
Filter Class
package com.logicbig.example;
import java.util.Date;
public class DateOfBirthFilter {
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof Date)) {
return false;
}
//date should be in the past
Date date = (Date) obj;
return !date.before(new Date());
}
}
package com.logicbig.example;
import java.util.regex.Pattern;
public class PhoneFilter {
private static Pattern phonePattern = Pattern.compile("\\d{3}-\\d{3}-\\d{4}");
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof String)) {
return false;
}
//phone must match the regex pattern
return !phonePattern.matcher(obj.toString()).matches();
}
}