cannot deserialize value of `java.util.Date` from array value (token `JsonToken.Start_Array`)
时间: 2025-01-19 19:15:31 浏览: 48
### 解决 Java 中 Jackson 反序列化 `java.util.Date` 类型时遇到的错误
当尝试将 JSON 数组反序列化为 `java.util.Date` 对象时,可能会遇到如下异常:“无法从 JsonToken.START_ARRAY 反序列化 java.util.Date”。这通常是因为默认情况下 Jackson 不知道如何处理这种类型的转换。
为了正确解析日期数组并将其映射到 `Date` 字段,可以自定义反序列化逻辑。以下是几种解决方案:
#### 方法一:使用 `@JsonFormat` 注解指定日期格式
如果输入数据是一个标准的时间戳或已知格式的字符串,则可以在目标类字段上添加 `@JsonFormat` 来指导 Jackson 如何解释这些值[^1]。
```java
public class Event {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date eventTime;
}
```
#### 方法二:编写自定义的 `JsonDeserializer`
对于更复杂的情况,比如需要处理多种可能的数据形式(如时间戳、ISO8601 字符串或其他),则应该创建一个新的 `JsonDeserializer<Date>` 实现来覆盖默认行为。
```java
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
class CustomDateDeserializer extends StdDeserializer<Date> {
protected CustomDateDeserializer() {
super(Date.class);
}
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException {
String dateStr = p.getText();
try {
return new SimpleDateFormat("yyyy-MM-dd").parse(dateStr);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
```
接着注册此自定义反序列器:
```java
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Date.class, new CustomDateDeserializer());
mapper.registerModule(module);
// 测试代码片段
String jsonString = "[\"2023-09-15\"]";
List<Date> dates = Arrays.asList(mapper.readValue(jsonString, Date[].class));
System.out.println(dates.get(0));
```
通过上述方法之一,能够有效地解决由于不兼容的数据结构而导致的反序列化失败问题。
阅读全文
相关推荐



















