Spring Boot 中使用 Jackson 实现全局时间格式处理(支持多格式反序列化)

发布于:2025-06-28 ⋅ 阅读:(13) ⋅ 点赞:(0)

好的,以下是整理好的 CSDN 博文格式内容,适合你发布为一篇讲解 Jackson 全局时间配置的文章:


Spring Boot 中使用 Jackson 实现全局时间格式处理(支持多格式反序列化)

在实际开发中,我们经常需要处理前后端交互中的时间字段。为了统一时间格式,通常会在字段上添加 @JsonFormat 注解,但如果项目中字段很多,这种方式会显得重复且难以维护。

本文将介绍如何通过配置 Jackson 的全局时间格式,实现对 Date 类型的统一 序列化反序列化,并支持多种时间格式自动识别,无需在每个字段上加注解。


一、目标实现效果

功能 是否需要注解 是否生效
Date 序列化(Java → JSON) ❌ 不需要注解 ✅ 使用统一格式
Date 反序列化(JSON → Java) ❌ 不需要注解 ✅ 支持多格式
LocalDateTime 支持 ⚠️ 需要单独配置 ✅ 可选扩展支持

二、自定义多格式反序列化器

首先,我们创建一个支持多种时间格式的反序列化器 FlexibleDateDeserializer

public class FlexibleDateDeserializer extends JsonDeserializer<Date> {

    private static final List<String> DATE_FORMATS = Arrays.asList(
        "yyyy-MM-dd HH:mm:ss",
        "yyyy-MM-dd",
        "yyyy/MM/dd HH:mm:ss",
        "yyyy/MM/dd",
        "yyyyMMddHHmmss",
        "yyyyMMdd"
    );

    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String dateStr = p.getText().trim();
        if (dateStr.isEmpty()) return null;

        for (String format : DATE_FORMATS) {
            try {
                SimpleDateFormat sdf = new SimpleDateFormat(format);
                sdf.setLenient(false);
                return sdf.parse(dateStr);
            } catch (ParseException ignored) {
            }
        }

        throw new IllegalArgumentException("Unparseable date: \"" + dateStr + "\". Supported formats: " + DATE_FORMATS);
    }
}

三、全局注册 Jackson 配置

通过 Spring Boot 提供的 Jackson2ObjectMapperBuilderCustomizer,我们可以注册这个反序列化器,并设置全局格式:

@Configuration
public class JacksonConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer customDateFormat() {
        return builder -> {
            builder.deserializerByType(Date.class, new FlexibleDateDeserializer());
            builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 统一序列化格式
            builder.timeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        };
    }
}

四、使用效果

无需任何注解,直接使用 Date 类型字段即可:

public class OrderDTO {
    private Date deliveryTime;
}

示例交互:

✅ 前端传值(反序列化)支持:
  • 2025-06-26
  • 2025-06-26 14:30:00
  • 2025/06/26 14:30:00
  • 20250626143000
✅ 后端返回(序列化)格式统一为:
"deliveryTime": "2025-06-26 14:30:00"

五、关于 LocalDateTime 的支持(可选)

如果你使用的是 LocalDateTime 类型,可以单独添加一个类似的多格式解析器(可参考 这篇扩展实现)。


六、注意事项

  • 全局配置只影响 java.util.Date 类型;
  • LocalDateTimeLocalDate 等 Java 8 时间类需要单独注册反序列化器;
  • 如果某个字段需要特殊格式,可以局部添加 @JsonFormat@JsonDeserialize 注解覆盖默认行为。

七、总结

通过这种方式,我们可以在项目中实现:

  • 全局统一时间格式输出(序列化);
  • 高容错时间格式解析(反序列化);
  • 避免在每个字段上重复添加注解;
  • 提升项目可维护性和开发效率。

如需支持 LocalDateTimeZonedDateTime 等更多类型的多格式解析,可以进一步拓展 JacksonConfig 配置。


📌 觉得有帮助?欢迎点赞 / 收藏 / 关注我,持续分享更多实用 Java & Spring Boot 技巧!

如需源码或有问题交流,欢迎留言讨论~


网站公告

今日签到

点亮在社区的每一天
去签到