将ObjectMapper迁移到JsonMapper
我现在正在将我的应用升级到 Jackson 3.x(以及Spring Boot 4.0)。在Jackson 2中,我已有一个现成的 ObjectMapper bean,它手动配置 JavaTimeModule,使用了特定的 DateTimeFormatter 模式以及若干功能开关。
在Jackson 3中,我注意到 ObjectMapper 现在是不可变的,遵循构建器模式,包名也从 com.fasterxml.jackson 变为 tools.jackson。另外,JavaTimeModule(jsr310)似乎已默认集成。
@Bean
public ObjectMapper objectMapper() {
JavaTimeModule module = new JavaTimeModule();
ObjectMapper mapper = new ObjectMapper();
module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME));
module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ISO_DATE_TIME));
module.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_DATE));
module.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_DATE));
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.registerModule(module);
mapper.setSerializationInclusion(Include.NON_NULL);
return mapper;
}
如何使用新的Jackson 3 Builder API重建这个特定的配置(尤其是LocalDateTime和 LocalDate的自定义DateTimeFormatter)?我还能否向“内置”的时间支持添加自定义序列化/反序列化器,还是应该继续注册一个模块?
解决方案
起点是 JsonMapper.builder() 或 JsonMapper.builderWithJackson2Defaults(),取决于你是想完全兼容还是想接受新的默认设置。
从那里我们可以按需添加内容。先从模块开始。现在不再有 JavaTimeModule,因此改用 SimpleModule 了。你可以像往常一样向其中添加序列化器和反序列化器。构建器提供 addModule 方法来添加模块。
对特性的配置可以在构建器上通过任意的 configure 方法来完成。
至于包含策略,这部分有点棘手但一旦你知道要使用 changeDefaultPropertyInclusion,就可以实现。
结果:
SimpleModule module = new SimpleModule();
module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME));
module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ISO_DATE_TIME));
module.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_DATE));
module.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_DATE));
return JsonMapper.builder()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(StreamWriteFeature WRITE_BIGDECIMAL_AS_PLAIN, true)
.configure(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS, false)
.addModule(module)
.changeDefaultPropertyInclusion(inclusion -> inclusion.withValueInclusion(Include.NON_NULL))
.build();
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。