Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JacksonMapper日期与UTC时区反序列化失败,格式为给定格式_Java_Jackson_Fasterxml_Date - Fatal编程技术网

Java JacksonMapper日期与UTC时区反序列化失败,格式为给定格式

Java JacksonMapper日期与UTC时区反序列化失败,格式为给定格式,java,jackson,fasterxml,date,Java,Jackson,Fasterxml,Date,我知道关于同一个问题有很多重复的问题,但是,我无法将给定的日期格式反序列化为java.util.date对象。我使用的客户机api返回的日期字段是6位数字加上毫秒和纳秒 2016-12-08T20:09:05.508883Z 2016-12-08T20:09:05.527Z 有时包括纳秒,有时不包括。我试着从库本身跟踪反序列化示例,但找不到解决方法。假设这是一个json blob示例 { "id": "68e6a28f-ae28-4788-8d4f-5ab4e5e5ae08",

我知道关于同一个问题有很多重复的问题,但是,我无法将给定的日期格式反序列化为
java.util.date
对象。我使用的客户机api返回的日期字段是6位数字加上毫秒和纳秒

  • 2016-12-08T20:09:05.508883Z
  • 2016-12-08T20:09:05.527Z
有时包括纳秒,有时不包括。我试着从库本身跟踪反序列化示例,但找不到解决方法。假设这是一个json blob示例

{
    "id": "68e6a28f-ae28-4788-8d4f-5ab4e5e5ae08",
    "created_at": "2016-12-08T20:09:05.508883Z",
    "done_at": "2016-12-08T20:09:05.527Z"
}
Entity.java

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class OrderResponse {
    private String id;

    @JsonProperty("created_at")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'*'", timezone = "UTC")
    private Date createdAt;

    @JsonProperty("done_at")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'*'", timezone = "UTC")
    private Date doneAt;
}
如果我只使用格式
yyyy-MM-dd'T'HH:MM:ss
jackson映射器反序列化来自jvm本身的时区。但我需要使用UTC格式,并且我还尝试实现自定义反序列化器和序列化器,但这两种方式都不起作用。我的问题是
java.util.Date
正确的对象类型?此外,我还尝试通过注册
newjavatimemodule()
创建自己的对象映射器,但没有成功


谢谢您的帮助。

我发现
java.time.format.DateTimeFormatter
具有
ISO\u INSTANT
格式类型,它支持我正在寻找的格式

基本上,我编写了自定义反序列化程序

public class CustomInstantDeserializer extends JsonDeserializer<Instant> {

    private DateTimeFormatter fmt = DateTimeFormatter.ISO_INSTANT.withZone(ZoneOffset.UTC);

    @Override
    public Instant deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return Instant.from(fmt.parse(p.getText()));
    }
}

…您的问题主要源于您使用的是
java.util.Date
,应该将其从痛苦中解脱出来。您是否能够切换到更合适的类型,如
java.time.Instant
(尽管这需要加载额外的jackson模块以获得最佳支持)?@Clockwork Muse是的,我可以从日期移动到即时,但我无法将给定格式解析为即时格式。
@JsonProperty("created_at")
@JsonDeserialize(using = CustomInstantDeserializer.class)
private Instant createdAt;