From 62c50cf6e078be747b0a2a1c77226a6a7195d3e3 Mon Sep 17 00:00:00 2001 From: Sander Mak Date: Mon, 18 Jan 2016 15:27:36 +0100 Subject: [PATCH] Handle JSON serialized Dates from JavaScript in LocalDateDeserializer --- .../jsr310/deser/LocalDateDeserializer.java | 14 +++++++++++--- .../jsr310/TestLocalDateSerialization.java | 12 ++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateDeserializer.java b/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateDeserializer.java index 00be8bb8..f4652d84 100644 --- a/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateDeserializer.java @@ -17,7 +17,10 @@ package com.fasterxml.jackson.datatype.jsr310.deser; import java.io.IOException; +import java.time.Instant; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import com.fasterxml.jackson.core.*; @@ -64,9 +67,14 @@ public LocalDate deserialize(JsonParser parser, DeserializationContext context) // if we are using default formatter DateTimeFormatter format = _formatter; if (format == DEFAULT_FORMATTER) { - if (string.contains("T")) { - return LocalDate.parse(string, DateTimeFormatter.ISO_LOCAL_DATE_TIME); - } + // JavaScript by default includes time in JSON serialized Dates (UTC/ISO instant format). + if (string.length() > 10 && string.charAt(10) == 'T') { + if (string.endsWith("Z")) { + return LocalDateTime.ofInstant(Instant.parse(string), ZoneOffset.UTC).toLocalDate(); + } else { + return LocalDate.parse(string, DateTimeFormatter.ISO_LOCAL_DATE_TIME); + } + } } return LocalDate.parse(string, format); } diff --git a/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateSerialization.java b/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateSerialization.java index f8f0944d..77332b81 100644 --- a/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateSerialization.java +++ b/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateSerialization.java @@ -21,9 +21,11 @@ import static org.junit.Assert.assertTrue; import java.time.format.DateTimeParseException; +import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.Month; +import java.time.ZoneOffset; import java.time.temporal.Temporal; import com.fasterxml.jackson.annotation.JsonFormat; @@ -171,6 +173,16 @@ public void testDeserializationAsString04() throws Exception this.MAPPER.readValue("\"2015-06-19TShouldNotParse\"", LocalDate.class); } + @Test + public void testDeserializationAsString05() throws Exception + { + Instant instant = Instant.now(); + LocalDate value = MAPPER.readValue('"' + instant.toString() + '"', LocalDate.class); + + assertNotNull("The value should not be null.", value); + assertEquals("The value is not correct.", LocalDateTime.ofInstant(instant, ZoneOffset.UTC).toLocalDate(), value); + } + @Test public void testDeserializationWithTypeInfo01() throws Exception {