json parse error cannot deserialize value of type java.util.date
时间: 2025-01-07 19:55:10 浏览: 25
### 解决 Java 中 JSON 日期反序列化错误
当遇到 `JSON parse error: Cannot deserialize value of type java.util.Date from String` 错误时,主要问题是 Jackson 默认使用的日期格式与实际传入的字符串格式不匹配。Jackson 默认期望的是 ISO8601 格式的日期时间字符串 (例如:`yyyy-MM-dd'T'HH:mm:ss.SSSZ`)。
#### 自定义日期格式解析器
可以通过自定义 Jackson 的 ObjectMapper 来指定预期的日期格式:
```java
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
public class DateDeserializerExample {
public static void main(String[] args) throws Exception {
// 创建ObjectMapper实例并注册Java Time模块支持
ObjectMapper mapper = new ObjectMapper();
// 注册JSR310模块以处理新的java.time包中的类
mapper.registerModule(new JavaTimeModule());
// 设置接受任何未知属性而不抛出异常
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 定义输入JSON字符串
String jsonString = "{\"date\":\"2024-09-19 10:40:43\"}";
// 将JSON映射到POJO
MyDateClass myObj = mapper.readValue(jsonString, MyDateClass.class);
System.out.println(myObj.getDate());
}
}
class MyDateClass {
private java.util.Date date;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
public java.util.Date getDate() { return date; }
public void setDate(java.util.Date date) { this.date = date; }
}
```
上述代码通过设置 `@JsonFormat` 注解来告知 Jackson 序列化/反序列化过程中应采用何种模式[^1]。
#### 配置全局日期格式
如果希望在整个应用程序范围内统一配置日期格式,则可以在 Spring Boot 中进行如下配置:
```yaml
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
```
此方法适用于所有基于 Jackson 进行数据绑定的操作,并且不需要修改实体类上的注解[^2]。
#### 使用 LocalDate 或 LocalDateTime 替代 java.util.Date
考虑到 `java.util.Date` 已经被标记为过时,在新项目中推荐使用 `LocalDateTime`, `LocalDate` 和其他来自 `java.time.*` 包下的现代 API:
```java
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime dateTimeField;
```
这些类提供了更清晰的时间概念分离以及更好的线程安全性特性[^3]。
阅读全文