在使用 Jackson 进行 JSON 反序列化时,如果需要将 JSON 中的日期时间字符串转换为 LocalDateTime
类型,并指定特定的格式,可以使用 @JsonFormat
注解。以下是具体的使用方法:
1. 添加依赖
确保你的项目中已经引入了 Jackson 依赖。如果使用 Maven,可以在 pom.xml
中添加以下依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
jackson-datatype-jsr310
是 Jackson 对 Java 8 日期时间类型(如 LocalDateTime
)的支持模块。
2. 在实体类中使用 @JsonFormat
在实体类的 LocalDateTime
字段上添加 @JsonFormat
注解,并指定日期时间的格式:
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;
public class Order {
private String orderId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 指定日期时间格式
private LocalDateTime purchaseTime;
// 省略其他字段、构造方法、getter 和 setter
}
3. 全局配置日期时间格式
如果你希望在整个应用中统一 LocalDateTime
的序列化和反序列化格式,可以在 application.properties
或 application.yml
中配置 Jackson 的默认行为:
application.properties
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
application.yml
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
4. 自定义 ObjectMapper
如果需要更灵活地配置 Jackson 的行为,可以自定义 ObjectMapper
并注册 JavaTimeModule
:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule()); // 注册 JavaTimeModule
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); // 禁用时间戳格式
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); // 设置日期格式
return objectMapper;
}
}
5. 示例:完整代码
实体类
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;
public class Order {
private String orderId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime purchaseTime;
// 省略其他字段、构造方法、getter 和 setter
}
控制器
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderController {
@PostMapping("/order")
public String createOrder(@RequestBody Order order) {
return "Order created with purchase time: " + order.getPurchaseTime();
}
}
测试 JSON
{
"orderId": "12345",
"purchaseTime": "2023-10-01 14:30:00"
}
6. 注意事项
@JsonFormat
注解可以同时用于序列化和反序列化。- 如果 JSON 中的日期时间格式与
@JsonFormat
指定的格式不匹配,Jackson 会抛出异常。 - 如果需要处理时区问题,可以在
@JsonFormat
中指定timezone
属性,例如:@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime purchaseTime;
通过以上方式,你可以轻松地在 Spring Boot 中使用 Jackson 反序列化 LocalDateTime
并指定日期时间格式。