自定义 Jackson 序列化、反序列化,支持 Java 8 日期新特性

ava 8 中,引入了新的时间和日期 API,相比较老旧的 Date , 它使用起来更加便捷,用过的都懂。自定义 Spring Boot 内置的 JSON 框架 Jackson,让出入参支持序列化、反序列化 Java 8 中新的日期 API : LocalDateTimeLocalDateLocalTime

默认情况下

Spring Boot默认已经为你配置了一个合理的ObjectMapper实例。Spring Boot通过自动配置机制(Auto-configuration)来提供一个预配置好的ObjectMapper,通常情况下已经足够满足大多数应用的需求。对于许多普通的Web应用来说,Spring Boot提供的默认配置已经足够满足需求,因此你可能并没有感觉到需要额外配置Jackson。Spring Boot会自动装配一个预配置的ObjectMapper到你的应用中,你可以直接注入并使用。

自定义 Jackson 配置类

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        // 初始化一个 ObjectMapper 对象,用于自定义 Jackson 的行为
        ObjectMapper objectMapper = new ObjectMapper();
		
		// 忽略未知字段(前端有传入某个字段,但是后端未定义接受该字段值,则一律忽略掉)
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
		
        // JavaTimeModule 用于指定序列化和反序列化规则
        JavaTimeModule javaTimeModule = new JavaTimeModule();

        // 支持 LocalDateTime、LocalDate、LocalTime
        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")));
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
        javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));

        objectMapper.registerModule(javaTimeModule);

        // 设置时区
        objectMapper.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));

        // 设置凡是为 null 的字段,返参中均不返回,请根据项目组约定是否开启
        // objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        return objectMapper;
    }
}

上述代码中,我们定义了一个 ObjectMapper Bean,它用于自定义 Jackson 的行为,然后,通过 JavaTimeModule 添加了 LocalDateTime、LocalDate、LocalTime 的序列化、反序列化规则,搞定这些后,再设置时区、以及序列化中是否包含值为 null 的字段

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部