Jackson序列化(3)— Jackson中ObjectMap
Jackson序列化(1)— [SpringBoot2.x]-Jackson在HttpMessageConverter(消息转换器)中的使用
Jackson序列化(2)— [SpringBoot2.x]-Spring容器中ObjectMapper
Jackson序列化(3)— Jackson中ObjectMapper配置详解
Jackson序列化(4)— Jackson“默认的”时间格式化类—StdDateFormat解析
Jackson序列化(5) — Jackson的ObjectMapper.DefaultTyping.NON_FINAL属性
Jackson序列化(6)— Java使用Jackson进行序列化
上文讲述了如何在SpringBoot2.x环境下去修改容器中的ObjectMapper。那么ObjectMapper提供了什么样的配置供开发人员操作?
![](https://img.haomeiwen.com/i16013479/417b6662d5bc5e92.png)
1. ObjectMapper的参数配置
1.1 针对于ObjectMapper直接配置
源码:com.fasterxml.jackson.databind.SerializationFeature
该类是一个枚举类型,只有一个boolean
类型的参数。即开启/禁用该设置。一般我们使用ObjectMapper objectMapper = new ObjectMapper();
创建出来的ObjectMapper
对象,实际上包含了SerializationFeature
类的默认配置。我们若想修改配置,可以使用下面的方法,如代码1所示:
代码1:修改ObjectMapper中的SerializationFeature参数。
//SerializationFeature代表配置;state代表状态
public ObjectMapper configure(SerializationFeature f, boolean state)
//启用SerializationFeature配置
public ObjectMapper enable(SerializationFeature f)
//禁用配置
public ObjectMapper disable(SerializationFeature f)
1.2 SpringBoot2.x使用Builder进行配置
我们按照SpringBoot2.x的思路,需要自定义Jackson2ObjectMapperBuilderCustomizer
子类并加入到IOC容器中。
并且在SpringBoot2.x中,引入了下面的依赖。使用builder创建ObjectMapper
时注册objectMapper.registerModule(new JavaTimeModule())
。解决了JDK1.8的新时间类LocalDateTime的问题。
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
核心代码:可以调整ObjectMapper序列化和反序列化特性。
@Component
public class MyJackson2ObjectMapperBuilderCustomizer implements Jackson2ObjectMapperBuilderCustomizer, Ordered {
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
//若POJO对象的属性值为null,序列化时不进行显示
jacksonObjectMapperBuilder.serializationInclusion(JsonInclude.Include.NON_NULL);
//若POJO对象的属性值为"",序列化时不进行显示
jacksonObjectMapperBuilder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
//DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES相当于配置,JSON串含有未知字段时,反序列化依旧可以成功
jacksonObjectMapperBuilder.failOnUnknownProperties(false);
//序列化时的命名策略——驼峰命名法
jacksonObjectMapperBuilder.propertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
//针对于Date类型,文本格式化
jacksonObjectMapperBuilder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
//针对于JDK新时间类。序列化时带有T的问题,自定义格式化字符串
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
jacksonObjectMapperBuilder.modules(javaTimeModule);
// jacksonObjectMapperBuilder.featuresToEnable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
//默认关闭,将char[]数组序列化为String类型。若开启后序列化为JSON数组。
jacksonObjectMapperBuilder.featuresToEnable(SerializationFeature.WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS);
//默认开启,若map的value为null,则不对map条目进行序列化。(已废弃)。
// 推荐使用:jacksonObjectMapperBuilder.serializationInclusion(JsonInclude.Include.NON_NULL);
jacksonObjectMapperBuilder.featuresToDisable(SerializationFeature.WRITE_NULL_MAP_VALUES);
//默认开启,将Date类型序列化为数字时间戳(毫秒表示)。关闭后,序列化为文本表现形式(2019-10-23T01:58:58.308+0000)
//若设置时间格式化。那么均输出格式化的时间类型。
jacksonObjectMapperBuilder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
//默认关闭,在类上使用@JsonRootName(value="rootNode")注解时是否可以包裹Root元素。
// (https://blog.csdn.net/blueheart20/article/details/52212221)
// jacksonObjectMapperBuilder.featuresToEnable(SerializationFeature.WRAP_ROOT_VALUE);
//默认开启:如果一个类没有public的方法或属性时,会导致序列化失败。关闭后,会得到一个空JSON串。
jacksonObjectMapperBuilder.featuresToDisable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
//默认关闭,即以文本(ISO-8601)作为Key,开启后,以时间戳作为Key
jacksonObjectMapperBuilder.featuresToEnable(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS);
//默认禁用,禁用情况下,需考虑WRITE_ENUMS_USING_TO_STRING配置。启用后,ENUM序列化为数字
jacksonObjectMapperBuilder.featuresToEnable(SerializationFeature.WRITE_ENUMS_USING_INDEX);
//仅当WRITE_ENUMS_USING_INDEX为禁用时(默认禁用),该配置生效
//默认关闭,枚举类型序列化方式,默认情况下使用Enum.name()。开启后,使用Enum.toString()。注:需重写Enum的toString方法;
jacksonObjectMapperBuilder.featuresToEnable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
//默认开启,空Collection集合类型输出空JSON串。关闭后取消显示。(已过时)
// 推荐使用serializationInclusion(JsonInclude.Include.NON_EMPTY);
jacksonObjectMapperBuilder.featuresToEnable(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS);
//默认关闭,当集合Collection或数组一个元素时返回:"list":["a"]。开启后,"list":"a"
//需要注意,和DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY 配套使用,要么都开启,要么都关闭。
// jacksonObjectMapperBuilder.featuresToEnable(SerializationFeature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED);
//默认关闭。打开后BigDecimal序列化为文本。(已弃用),推荐使用JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN配置
// jacksonObjectMapperBuilder.featuresToEnable(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN);
//默认关闭,即使用BigDecimal.toString()序列化。开启后,使用BigDecimal.toPlainString序列化,不输出科学计数法的值。
jacksonObjectMapperBuilder.featuresToEnable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
/**
* JsonGenerator.Feature的相关参数(JSON生成器)
*/
//默认关闭,即序列化Number类型及子类为{"amount1":1.1}。开启后,序列化为String类型,即{"amount1":"1.1"}
jacksonObjectMapperBuilder.featuresToEnable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
/******
* 反序列化
*/
//默认关闭,当JSON字段为""(EMPTY_STRING)时,解析为普通的POJO对象抛出异常。开启后,该POJO的属性值为null。
jacksonObjectMapperBuilder.featuresToEnable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
//默认关闭
// jacksonObjectMapperBuilder.featuresToEnable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
//默认关闭,若POJO中不含有JSON中的属性,则抛出异常。开启后,不解析该字段,而不会抛出异常。
jacksonObjectMapperBuilder.featuresToEnable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
}
@Override
public int getOrder() {
return 1;
}
}
官方文档参考
【2.7.0 SerializationFeature API文档】
【2.7.0 DeserializationFeature API文档】
【2.7.0 JsonGenerator.Feature API文档】
推荐阅读
为什么设置new BigDecimal(1.10),却得到一大串数字
BigDecimal的toString和toPlainString的区别
DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT参数为啥不起作用!