@JsonInclude注解可用于指示何时可以对添加注解的属性进行序列化。通常会包含属性值,但是通过使用这个注解,我们可以基于属性值指定简单的排除规则。
这个注解可用于字段,方法或构造函数参数。它也可以在类上使用,这样对应的规则将应用于类的所有属性。
以下是@JsonInclude定义代码段:
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD,
ElementType.TYPE, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface JsonInclude
{
public Include value() default Include.ALWAYS;//inclusion rules
public Include content() default Include.ALWAYS;//rules on content (e.g. Map's elements)
public Class<?> valueFilter() default Void.class;//used for values when Include.CUSTOM
public Class<?> contentFilter() default Void.class;//used for contents values when Include.CUSTOM
public enum Include{
ALWAYS,//always include property
NON_NULL,//do not include property with null value
NON_ABSENT,//no null values including no content null values like Optional, AtomicReference etc
NON_EMPTY,//NON_NULL + NON_ABSENT + values like empty Collections/Map/arrays/String etc are excluded
NON_DEFAULT,//no default values, e.g. no primitives with default values
CUSTOM,// a custom filter for exclusion specified by JsonInclude.valueFilter()
USE_DEFAULTS//use defaults either from class level or ObjectMapper level
;
}
}
例子
定义对象
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Employee {
private String name;
private String dept;
private String address;
}
Main方法
public class ExampleMain {
public static void main(String[] args) throws IOException {
Employee employee = Employee.of("Trish", null, null);
ObjectMapper om = new ObjectMapper();
String jsonString = om.writeValueAsString(employee);
System.out.println(jsonString);
}
}
结果
{"name":"Trish"}
如上所示,序列化期间不包含’dept’和’address’属性,因为我们为它们设置了null。
没有@JsonInclude
如果我们不使用@JsonIncludeEmployee类,那么输出将是:
{“ name”:“ Trish”,“ dept”:null,“ address”:null}
使用ObjectMapper#setDefaultPropertyInclusion()
此方法或ObjectMapper#setSerializationInclusion()可用于全局指定包含规则。例如,以下将产生与上面的示例相同的输出:
public class ExampleMain {
public static void main(String[] args) throws IOException {
Employee employee = Employee.of("Trish", null, null);
ObjectMapper om = new ObjectMapper();
om.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL);
String jsonString = om.writeValueAsString(employee);
System.out.println(jsonString);
}
}