Spring boot 项目解析JSON 字符中的日期报错:Invalid JSON input: Cannot deserialize value of type `java.util.Date` from String \"2024-05-24T01:06:58.656Z\": expected format \"yyyy-MM-dd HH:mm:ss\"
引入的 JSON 工具类依赖包:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.1</version>
</dependency>
配置文件内 JSON 配置:
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
定义的解析类字段:
/**
* 入库、出库日期
*/
@ApiModelProperty("入库、出库日期 yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date operationDate;
详细错误信息:
运行时异常:Invalid JSON input: Cannot deserialize value of type `java.sql.Date` from String \"2024-05-24T01:06:58.656Z\": expected format \"yyyy-MM-dd HH:mm:ss\"; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.sql.Date` from String \"2024-05-24T01:06:58.656Z\": expected format \"yyyy-MM-dd HH:mm:ss\"\n at [Source: (PushbackInputStream); line: 5, column: 19] (through reference chain: com.fastcnt.afterloan.vo.CarOperationReqVO[\"operationDate\"])
...
Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.sql.Date` from String "2024-05-24T01:06:58.656Z": expected format "yyyy-MM-dd HH:mm:ss"
at [Source: (PushbackInputStream); line: 5, column: 19] (through reference chain: com.fastcnt.afterloan.vo.CarOperationReqVO["operationDate"])
...
Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Invalid JSON input: Cannot deserialize value of type `java.sql.Date` from String "2024-05-24T01:06:58.656Z": expected format "yyyy-MM-dd HH:mm:ss"; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.sql.Date` from String "2024-05-24T01:06:58.656Z": expected format "yyyy-MM-dd HH:mm:ss"
at [Source: (PushbackInputStream); line: 5, column: 19] (through reference chain: com.fastcnt.afterloan.vo.CarOperationReqVO["operationDate"])]
网上翻了一圈,有点把自己都搞混乱了,回过头来理解就比较简单了。JSON 日期格式解析会有一个默认的 pattern
:yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
。查了一下,这个属于 UTC 下的 ISO 1681 日期表示方法,T
分隔日期和时间,Z
放在末尾。此时如果不做任何的配置,那么默认就会以这种格式来解析 JSON 中的日期。
但我们正常使用的都是 yyyy-MM-dd HH:mm:ss
格式,包括传递参数,所以会倾向于设置一下默认的解析格式,即像上面的JSON 配置。这也是错误说明里解释了为什么期望的是 expected format \"yyyy-MM-dd HH:mm:ss\"
格式。配置文件里的配置项属于全局配置,这意味着所有的这种格式的日期都不需要添加 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
注解,即可直接使用。
那么现在问题就清晰了,需要针对 2024-05-24T01:06:58.656Z
格式的日期,设置匹配的 pattern
:
/**
* 入库、出库日期
*/
@ApiModelProperty("入库、出库日期 yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
private Date operationDate;