JSON 解析错误:无法从字符串反序列化 `java.time.LocalDateTime` 类型的值

Geo*_*hev 1 java spring json jackson postman

我正在向具有更新日期属性的外部服务发送请求

@UpdateTimestamp
@Column(name = "updated_date")
private LocalDateTime updatedDate;
Run Code Online (Sandbox Code Playgroud)

当我在 DTO 中收到响应时,我试图像这样格式化 LocalDateTime 属性

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime updatedDate;
Run Code Online (Sandbox Code Playgroud)

但是我在 Postman 中遇到错误

"message": "JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from String \"2020-04-14T10:45:07.719\": Text '2020-04-14T10:45:07.719' could not be parsed at index 14; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDateTime` from String \"2020-04-14T10:45:07.719\
Run Code Online (Sandbox Code Playgroud)

Ale*_*nko 9

输入字符串中有毫秒,因此您的格式应为“yyyy-MM-dd'T'HH:mm:ss.SSS”

更新:如果毫秒部分由1、2、3位数字组成或者是可选的,您可以使用以下格式:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss[.SSS][.SS][.S]")
private LocalDateTime updatedTime;
Run Code Online (Sandbox Code Playgroud)

  • @GeorgiMichev 你尝试过不使用“模式”吗?我相信默认格式就是您想要的,具有动态的小数位数。 (2认同)

小智 7

您可以删除注释@JsonFormat并让它以默认方式工作。即使我删除了毫秒,它对我来说工作得很好。

@NotNull
@FutureOrPresent(message = ErrorMessages.INVALID_CAMPAIGN_START_DATE)
//@JsonFormat(pattern = "MM/dd/yyyy")
private LocalDateTime campaignStartDate;
Run Code Online (Sandbox Code Playgroud)

JSON 请求:

{  "campaignStartDate" : "2020-12-31T15:53:16",
  "campaignExpDate" : "2021-01-24T15:53:16",
}

{
  "campaignStartDate" : "2020-12-31T15:53:16.45",
  "campaignExpDate" : "2021-01-24T15:53:16.45",
}

{
  "campaignStartDate" : "2020-12-31T15:53:16.445",
  "campaignExpDate" : "2021-01-24T15:53:16.445",
}
Run Code Online (Sandbox Code Playgroud)

这些 JSON 请求将正常工作。