onkami
onkami

Reputation: 9431

Deserialize "Zulu" time in ISO8601 format in jackson

I have a need to de-serialize time of format 2016-11-28T10:34:25.097Z using Jackson into ZonedDateTime of Java8.

I believe I correctly configured ObjectMapper (a factory method):

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

And I have in my code for DTO a field

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

when I try to parse this by Jackson, I get

 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]  

Without @JsonFormat problem remains.

How I could possibly overcome this?

Upvotes: 4

Views: 9681

Answers (3)

Quentin
Quentin

Reputation: 11

I needed to serialize/deserialize a date in ISO8601 Zulu format 2016-11-28T10:34:25.097Z like you

I chose to change the date formatter in ObjectMapper using ISO8601DateFormat

like this

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

Upvotes: 1

Philipp Wirth
Philipp Wirth

Reputation: 920

In my optinion the following JsonFormat for ISO 8601

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

is much better, since this format is more intuitive to read and allows timezones like ACST with UTC offset of +09:30 too.

Upvotes: 0

pkalinow
pkalinow

Reputation: 1741

The problem is probably with 'Z' in the pattern. It does not allow literal 'Z' in the date time value. Try 'X' instead.

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

Upvotes: 7

Related Questions