【问题标题】:Jackson can't deserialize Date杰克逊无法反序列化日期
【发布时间】:2019-08-04 00:55:37
【问题描述】:

在我的应用程序中,我添加了 REST。为了测试这些方法,我在我的数据库中创建了一些基本行。

当我尝试使用带有 ID 的 GET 来获取数据库中的特定行时,我得到了 jackson 异常。

com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String "2019-03-11T10:14:14Z[UTC]": not a valid representation (error: Failed to parse Date value '2019-03-11T10:14:14Z[UTC]': Cannot parse date "2019-03-11T10:14:14Z[UTC]": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSZ', parsing fails (leniency? null))

我尝试制作的对象有一个字段

@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date published;

而被调用的构造函数是

public something(Date published) {
    this.published = published;
}

我阅读了一个 StackOverflow 问题,我应该添加

@JsonType(pattern="")

在“已发布”字段上方,但我似乎找不到需要导入的内容才能使该注释正常工作。

编辑: 多亏了 SHAHAKASH 的回答,我终于设法添加了注释。

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = TimeZone.getDefault(), locale = Locale.getDefault())

但是我有两个问题,一个是它不允许我保留时区和语言环境。所以删除这些让我的程序运行

@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")

这给了我错误:

Cannot deserialize value of type `java.util.Date` from String "2019-03-11T10:14:14Z[UTC]": expected format "yyyy-MM-dd'T'HH:mm:ss.SSS"

显然意味着我的格式错误。我很难找到正确的日期格式。

【问题讨论】:

  • @SHAHAKASH 嘿,谢谢你的回答!这大大减少了我的错误。但是我很难找到正确的模式。你能看看我的编辑,看看我需要什么模式吗?
  • 旁注:不要使用过时的 Date 类使用 LocalDate
  • 问题在您的代码中,最后z[UTC] 替换为"'yyyy-MM-dd'T'HH:mm:ss.SSS'Z" 可能会解决您的问题。

标签: java mysql rest jackson


【解决方案1】:

试试这个模式yyyy-MM-dd'T'HH:mm:ss'Z'

String testDate = "2019-03-11T10:14:14Z[UTC]";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date d = sdf.parse(testDate);
System.out.println(d);

输出:

Mon Mar 11 10:14:14 IST 2019

【讨论】:

  • 经过很多问题(在我这边),我终于尝试实施您的解决方案。它有效,我真的不能感谢你。这给我带来了很多问题/头痛/压力等等。但你真的想通了。所以再次感谢男人!你今天真的帮助了别人。
  • 那个输出是错误的。 2019-03-11T10:14:14Z[UTC] 表示与 Mon Mar 11 15:44:14 IST 2019 相同的时间点(假设 IST 代表印度标准时间)。
  • 不要使用DateSimpleDateFormat。忽略这是要与 Jackson 一起使用的事实,它就像 ZonedDateTime dateTime = ZonedDateTime.parse(testDate); 一样简单(不需要显式格式化程序)。和杰克逊一起,我相信你想要jackson-modules-java8
猜你喜欢
  • 2017-04-25
  • 1970-01-01
  • 2020-04-21
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
相关资源
最近更新 更多