使用 @JsonInclude#value = JsonInclude.Include.CUSTOM
并通过 @ JsonInclude#valueFilter
指定一个过滤器类,则该属性值只有在没有被过滤器类过滤的情况下才会被序列化。过滤器类的 equals()
方法用于过滤值;如果返回true,则值不会序列化。
同样,使用 @JsonInclude#value = JsonInclude.Include.CUSTOM
并通过 @JsonInclude#contentFilter
指定过滤器类,则如果过滤器类的 equals()
方法返回true,则不会序列化目标属性的内容值。
Example
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;
...
}
Filter Classes
日期必须是过去的日期
public class DateOfBirthFilter {
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof Date)) {
return false;
}
Date date = (Date) obj;
return !date.before(new Date());
}
}
手机号码必须与正则表达式匹配
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;
}
return phonePattern.matcher(obj.toString()).matches();
}
}
Main class
public class ExampleMain {
public static void main(String[] args) throws IOException {
Employee employee = new Employee();
employee.setName("Trish");
employee.setDateOfBirth(Date.from(ZonedDateTime.now().plusDays(1).toInstant()));
employee.setPhones(Map.of("Cell","111-111-1111", "Work", "(222) 222 2222"));
ObjectMapper om = new ObjectMapper();
String jsonString = om.writeValueAsString(employee);
System.out.println(jsonString);
}
}
{"name":"Trish","phones":{"Work":"(222) 222 2222"}}
不使用自定义过滤器
{"name":"Trish","dateOfBirth":1619091861386,"phones":{"Work":"(222) 222 2222","Cell":"111-111-1111"}}
原文链接
Jackson JSON - Applying Custom property inclusion rules using @JsonInclude.Include.CUSTOM