Ilja Tarasovs
Ilja Tarasovs

Reputation: 211

How to deserialize date '2017-01-01T00:00:59.000UTC'

Trying to deserialize date with specific pattern from json file.
Object which I want to receive from json file:

@Data
public class MyClass {
  @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'UTC'")
  @JsonDeserialize(using = LocalDateTimeDeserializer.class)
  private LocalDateTime date;
}

Json file:

{
  "date" : "2017-01-01T00:00:59.000UTC"
}

Code example how I want to receive it:

ObjectMapper mapper = new ObjectMapper();
MyClass clazz = mapper.readValue(new File("MyFile.json"), MyClass.class);

Actual result:

com.fasterxml.jackson.databind.exc.InvalidFormatException: 
Cannot deserialize value of type `java.time.LocalDateTime` from String "2017-01-01T00:00:59.000UTC":
Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) 
Text '2017-01-01T00:00:59.000UTC' could not be parsed, unparsed text found at index 23
at [Source: (File); line: 2, column: 11] (through reference chain: com.example.MyClass["date"])

How to deserialize current date pattern?

Upvotes: 0

Views: 2421

Answers (3)

Michael Gantman
Michael Gantman

Reputation: 7798

Try removing @JsonDeserialize. (In any case, you are trying to deserialize your date into LocalDateTime but it has time zone info, you would need to try ZonedDateTime or OffsetDateTime). And change the line

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

to

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

Here is the link to the question that has a full answer for you: Spring Data JPA - ZonedDateTime format for json serialization

Upvotes: 0

Shyam Baitmangalkar
Shyam Baitmangalkar

Reputation: 1073

The date format that you are using is incorrect.

Instead of: yyyy-MM-dd'T'HH:mm:ss.SSS'UTC'

it should be: yyyy-MM-dd'T'HH:mm:ss.SSSz

Secondly, you need to use @JsonFormat to specify the date format.

@JsonFormat which is defined in jackson-databind package gives you more control on how to format Date and Calendar values according to SimpleDateFormat.

By using this, the POJO MyClass would look something like this:

@Data
public class MyClass {
  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSz", timezone = "UTC")
  @JsonDeserialize(using = LocalDateTimeDeserializer.class)
  private LocalDateTime date;
}

Now, if you try to deserialize using:

ObjectMapper mapper = new ObjectMapper();
MyClass clazz = mapper.readValue(new File("MyFile.json"), MyClass.class);
System.out.println(myClass);

Then the process would go through, producing a result something like this:

MyClass{date=2017-01-01T00:00:59.000}

Upvotes: 2

phil_g
phil_g

Reputation: 516

Your date is in incorrect format (with UTC as text simply appended), but you can solve it by custom formatter.

public class Test {

  public static void main(String[] args) throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    MyClass localDateTime = objectMapper.readValue("{\"date\":\"2017-01-01T00:00:59.000UTC\"}", MyClass.class);
    System.out.println(localDateTime.date);
  }

  @Data
  public static class MyClass {
    @JsonDeserialize(using = CustomDeserializer.class)
    private LocalDateTime date;

  }

  public static class CustomDeserializer extends LocalDateTimeDeserializer {

    public CustomDeserializer() {
      super(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
    }

    protected CustomDeserializer(LocalDateTimeDeserializer base, Boolean leniency) {
      super(base, leniency);
    }

    @Override
    public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
      String substring = jsonParser.getText().substring(0, jsonParser.getText().indexOf("U"));
      return LocalDateTime.parse(substring, _formatter);
    }
  }

}

Upvotes: 2

Related Questions