Spring Boot 中使用 Jackson 实现全局时间格式处理(支持多格式反序列化)
好的,以下是整理好的 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");@Overridepublic 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 {@Beanpublic 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
类型; LocalDateTime
、LocalDate
等 Java 8 时间类需要单独注册反序列化器;- 如果某个字段需要特殊格式,可以局部添加
@JsonFormat
或@JsonDeserialize
注解覆盖默认行为。
七、总结
通过这种方式,我们可以在项目中实现:
- 全局统一时间格式输出(序列化);
- 高容错时间格式解析(反序列化);
- 避免在每个字段上重复添加注解;
- 提升项目可维护性和开发效率。
如需支持 LocalDateTime
、ZonedDateTime
等更多类型的多格式解析,可以进一步拓展 JacksonConfig
配置。
📌 觉得有帮助?欢迎点赞 / 收藏 / 关注我,持续分享更多实用 Java & Spring Boot 技巧!
如需源码或有问题交流,欢迎留言讨论~