【问题标题】:JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from StringJSON解析错误:无法从字符串反序列化“java.time.LocalDateTime”类型的值
【发布时间】:2020-07-26 21:36:27
【问题描述】:

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

@UpdateTimestamp
@Column(name = "updated_date")
private LocalDateTime updatedDate;

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

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

但我在 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\

【问题讨论】:

  • 你的模式完全没问题,我可以重现SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").parse("2020-04-14T10:45:07.719") 它不会抛出任何错误。也许杰克逊有问题。

标签: java json spring jackson postman


【解决方案1】:

输入字符串有毫秒,所以你的格式应该是“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;

【讨论】:

  • "yyyy-MM-dd'T'HH:mm:ss.SSS" 使它工作,但如果毫秒是两位数而不是每 10 个请求发生一次的 3,它会再次失败
  • @GeorgiMichev 你试过没有pattern吗?我相信默认格式是您想要的,具有动态的小数位数。
【解决方案2】:

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

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

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",
}

这些 JSON 请求可以正常工作。

【讨论】:

  • 这是一个非常有用且有趣的答案 - 对我来说非常好。
【解决方案3】:

我也遇到了同样的错误,我把这个用了 "pickupDate":"2014-01-01T00:00:00"

@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime pickupDate;

【讨论】:

    猜你喜欢
    • 2017-09-06
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2017-03-24
    • 2019-08-09
    • 2016-10-01
    • 2018-12-26
    • 2013-05-10
    相关资源
    最近更新 更多