Jackson相关的配置在MapperFeatrue这个枚举类中,查看源码可以发现可配置项及其默认值
通常情况下,配置文件和Jackson的注解可以满足需求,如需更多的定制化配置,可能需要JavaConfig
@Configuration
public class JacksonConfig {
@Primary
@Bean
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
JsonSerializer<RestPage<?>> serializer = new JsonSerializer<RestPage<?>>() {
@Override
public void serialize(RestPage<?> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeNumberField("current", value.getCurrent());
gen.writeObjectField("records", value.getRecords());
Class<?> activeView = serializers.getActiveView();
if (activeView != null && activeView.equals(RestPage.WithNameView.class)) {
gen.writeStringField("name", value.getName());
}
gen.writeEndObject();
}
};
builder.visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.NON_PRIVATE);
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
builder.dateFormat(new SimpleDateFormat("yyyy-MM-dd"));
builder.timeZone(ZoneOffset.UTC.getId());
builder.defaultViewInclusion(true);
builder.serializerByType(RestPage.class, serializer);
return builder.createXmlMapper(false).build();
}
}
注解在
可注解在注解、方法、属性上
例如注解在toString方法中,该类的序列化结果为toString返回的字符串
以下将会返回Employee对象的序列化结果
@JsonValue
public Employee employee() {
Employee employee = new Employee();
employee.setEmpNo(100L);
employee.setHireDate(new Date());
return employee;
}
可注解在注解、方法、属性、参数、类上
按场景序列化字段,例如某些场景下需要序列化密码,某些场景下不应序列化密码
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonView(UserInfo.class)
private String username;
@JsonView(UserDetail.class)
@JsonProperty("pwd")
private String password;
/* 默认所有字段defaultView */
System.out.println(objectMapper.writeValueAsString(user));
/* userInfoView,序列化userInfoView和defaultView */
System.out.println(objectMapper
.writerWithView(User.UserInfo.class)
.writeValueAsString(user));
/* userDetailView,序列化userDetailView和defaultView */
/* userDetailView继承自userInfo */
System.out.println(objectMapper
.writerWithView(User.UserDetail.class)
.writeValueAsString(user));
在SpringMVC中,可用于controller层方法上控制不同的序列化结果
可注解在注解、属性、方法、参数
当属性为Java Bean时,展平序列化结果,只有一层,不会嵌套
可注解于类、方法、参数、字段、注解
类似的注解还有@JsonTypeId、@JsonSubTypes等,不常用
可注解在注解、属性、方法、参数
@JsonProperty可用于设置序列化反序列化别名
@JsonProperty = @JsonGetter + @JsonSetter
序列化的值为toString方法,且不带双引号
注解在注解、字段、方法
序列化指定字段顺序
注解 方法、字段,注解
方法返回值为Map,其中的key、value会被序列化到结果中
@JsonAnySetter,与其相对
忽略字段或方法
注解在类上,该类不会被序列化、反序列化
常用的注解
NON_NULL为null是不序列化
NON_EMPTY,为空时不序列化
CUSTOME,自定义过滤器
指定实现JsonSerializer或Deserializer接口的类自定义序列化及反序列化行为
指定反序列的构造器
注解在构造方法、静态方法上
指定序列化的格式,比如时间日期格式,比如Number类型序列化字符串