JSON parse error: Cannot deserialize value of type java.time.LocalDateTime from String
Spring框架使用的默认使用Jackson,处理日期类型时发生的异常:错误类型:DateTimeParseException,错误发生在 Jackson 尝试将 "2025-10-14 18:26:14" 字符串转换为 java.time.LocalDateTime 类型时。可通过在字段上添加Jackson注解@
·
项目场景:
- SpringBoot项目,前端传来日期时间字段(字符串类型),后端进行逻辑操作处理之前,SpringMvcHttp消息转化时发生的问题。
完整问题描述:
- Cannot deserialize value of type
java.time.LocalDateTimefrom String “2025-10-14 18:57:32”: - Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text ‘2025-10-14 18:57:32’ could not be parsed at index 10(日期和时间之间的空格处)

问题描述
Spring框架使用的默认使用Jackson,处理日期类型时发生的异常:
- 错误类型:DateTimeParseException
- 错误位置:索引 10(日期和时间之间的空格处)
- 错误发生在 Jackson 尝试将 “2025-10-14 18:26:14” 字符串转换为 java.time.LocalDateTime 类型时。
捕获的异常信息
JSON parse error: Cannot deserialize value of type java.time.LocalDateTime from String “2025-10-14 18:26:14”: Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text ‘2025-10-14 18:26:14’ could not be parsed at index 10
原因分析:
- Spring MVC 采用的消息转换器主要是MappingJackson2HttpMessageConverter
- 用于处理 HTTP 请求和响应中的数据转换。
原因:Jackson 默认使用
- ISO 格式 (yyyy-MM-ddTHH:mm:ss) 解析日期时间,
- 你的数据使用的是 yyyy-MM-dd HH:mm:ss 格式
解决方案:
1、全局配置 Jackson(复杂一些)
通过 配置类 来统一处理 LocalDateTime 的序列化和反序列化:
- HTTP 消息转换器集成
- Spring MVC 使用 Jackson2ObjectMapperBuilder 来构建 ObjectMapper
- 自定义的 ObjectMapper 会被 MappingJackson2HttpMessageConverter 使用
- 该转换器负责处理 HTTP 请求/响应中的 JSON 数据转换
依赖导入
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.15.3</version> <!-- 版本根据项目调整 -->
</dependency>
Jackson配置类
@Configuration
public class JacksonConfig {
//自定义的 ObjectMapper 会被 MappingJackson2HttpMessageConverter 使用
//@Primary 注解的作用是:标记某个 Bean 为“首选”Bean。
@Bean
@Primary
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
//注册后,Jackson 就能正确地将 LocalDateTime 等类型序列化为标准的 ISO 格式字符串
mapper.registerModule(new JavaTimeModule());
//Jackson 将不再使用时间戳,而是使用 ISO-8601 格式的字符串 来序列化日期时间 mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
// 添加自定义 LocalDateTime 反序列化器
SimpleModule module = new SimpleModule();
module.addDeserializer(LocalDateTime.class,
new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
module.addSerializer(LocalDateTime.class,
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
//注册序列化器模块
mapper.registerModule(module);
return mapper;
}
}
2、注解方式 —— @JsonFormat (简单)
package com.crocodileQ.service.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;
/**
* 传感器数据对象
* @author crocodilePole
* @date 2025-10-11
*/
@Data
public class SensorData extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键ID */
private long id;
/** 采集数据的设备ID */
private long deviceId;
/** 设备序列号 */
private String deviceSn;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime collectedAt;
}

总结
- 以上两种解决方案,可以根据项目需要进行选择。
额外了解
Spring MVC 采用的消息转换器主要是
- HttpMessageConverter 接口的实现类
- 用于处理 HTTP 请求和响应中的数据转换。
主要的消息转换器包括:
| 消息转换器 | 描述 |
|---|---|
| MappingJackson2HttpMessageConverter | 处理 JSON 格式的数据转换 使用 ObjectMapper 进行序列化和反序列化 |
| StringHttpMessageConverter | 处理字符串类型的数据转换 |
| ByteArrayHttpMessageConverter | 处理字节数组类型的数据转换 |
| ResourceHttpMessageConverter | 处理资源文件类型的数据转换 |
| SourceHttpMessageConverter | 处理 XML Source 类型的数据转换 |
工作原理:
Spring MVC 会自动注册这些消息转换器
- 根据 HTTP 请求头的 Content-Type 和 Accept 字段
- 选择合适的消息转换器进行数据处理
- 对于 JSON 数据,主要使用 MappingJackson2HttpMessageConverter
这里是 鳄鱼杆的空间,钓……鳄鱼的杆儿!
期待下次再会!
愿你的每一次垂钓之旅都能满载而归。

更多推荐
所有评论(0)