@JsonFormat是Jackson提供的核心注解,用于统一JSON序列化与反序列化时的日期格式,支持pattern和timezone配置,实现前后端日期无缝转换。

在 Java Web 开发中,前后端交互时日期格式不一致是常见问题。后端用 Date 或 LocalDateTime,前端传的是字符串(如 "2024-05-20" 或 "2024-05-20T10:30:00"),直接接收或返回容易报错或格式混乱。@JsonFormat 就是解决这个“无缝转换”的核心注解之一,它由 Jackson 提供,作用于字段或方法,控制 JSON 序列化与反序列化时的日期格式。
一、@JsonFormat 的基本用法(字段级)
最常用的方式是在实体类的日期字段上加注解,指定格式、时区和解析行为:
public class User {
private String name;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
// getter/setter...
}
- pattern:定义 JSON 字符串与 Java 日期之间的格式模板,必须和实际传输格式严格匹配
-
timezone:避免时区偏移导致的时间错位(尤其注意 Spring Boot 默认使用系统时区,而前端 JS 的
Date默认按浏览器本地时区解析) - 该注解同时影响 入参(@RequestBody)反序列化 和 出参(@ResponseBody)序列化,真正实现双向统一
二、配合 @DateTimeFormat 处理表单提交(非 JSON 场景)
当接口接收的是 application/x-www-form-urlencoded(比如 POST 表单或 GET 查询参数)时,@JsonFormat 不生效。此时需搭配 @DateTimeFormat:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
public class UserForm {
private String name;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate birthday;
}
-
@DateTimeFormat是 Spring MVC 的注解,专用于非 JSON 的 Web 数据绑定 - 若一个字段既要支持 JSON 请求体,又要支持表单提交,建议两个注解都加上,确保兼容性
三、全局配置替代重复注解(推荐生产环境使用)
为避免每个日期字段都写 @JsonFormat,可在 Spring Boot 中做全局 Jackson 配置:
立即学习“Java免费学习笔记(深入)”;
@Configuration
public class JacksonConfig {
@Bean
@Primary
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
// 全局设置 LocalDateTime 格式
JavaTimeModule module = new JavaTimeModule();
module.addSerializer(LocalDateTime.class,
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
module.addDeserializer(LocalDateTime.class,
new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
mapper.registerModule(module);
mapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
return mapper;
}
}
- 全局配置后,所有
LocalDateTime字段默认按指定格式处理,无需每个字段加注解 - 若某个字段需要特殊格式(如只传日期),仍可用
@JsonFormat覆盖全局配置 - 注意:Spring Boot 2.2+ 默认已注册
JavaTimeModule,但时区和 pattern 仍需显式配置
四、常见坑与注意事项
实际开发中容易忽略的关键点:
-
pattern 必须和前端发送/期望的字符串完全一致:例如前端传
"2024/05/20",但后端写"yyyy-MM-dd",反序列化会失败 -
LocalDateTime没有时区信息,但@JsonFormat(timezone=...)对它无效;应改用ZonedDateTime或确保前后端约定好解释方式 - Spring Boot 3.x + Jakarta EE 迁移后,确认依赖是
jackson-databind(Jakarta 版本),避免 import 错误包(如javax.annotation→jakarta.annotation) - 若用 Lombok 的
@Data,注意@JsonFormat要加在字段上,而非 getter —— Lombok 生成的 getter 不继承字段注解

















