反序列化"祖鲁"杰克逊的ISO8601格式时间

时间:2016-11-28 13:46:40

标签: java json jackson zoneddatetime

我需要使用Jackson将格式时间 2016-11-28T10:34:25.097Z 反序列化为Java8的ZonedDateTime。

我相信我正确配置了ObjectMapper(工厂方法):

 @Bean
ObjectMapper getObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    // some other config...
    objectMapper.registerModule(new JavaTimeModule());
    return objectMapper;
}

我在DTO的代码中有一个字段

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

当我试图通过杰克逊解析这个时,我得到了

 java.lang.IllegalArgumentException: Can not deserialize value of type java.time.ZonedDateTime 
 from String "2016-11-28T10:34:25.097Z": Text '2016-11-28T10:34:25.097Z' could not be parsed,
 unparsed text found at index 23  at [Source: N/A; line: -1, column: -1]  

没有@JsonFormat问题仍然存在。

我怎么可能克服这个?

3 个答案:

答案 0 :(得分:3)

问题可能出在模式中的'Z'。它不允许在日期时间值中使用文字“Z”。请尝试'X'。

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

答案 1 :(得分:0)

我认为以下用于ISO 8601的JsonFormat

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

更好,因为这种格式更易于阅读,并且允许时区(如ACST)的UTC偏移也为+09:30。

答案 2 :(得分:0)

我需要对ISO8601 Zulu格式的日期进行序列化/反序列化 2016-11-28T10:34:25.097Z

我选择使用ISO8601DateFormat在ObjectMapper中更改日期格式程序

像这样

@Bean
ObjectMapper getObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    // some other config...
    objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    objectMapper.setDateFormat(new ISO8601DateFormat());
    return objectMapper;
}