Skip to content

Commit

Permalink
Add Instant support to JSON mapper configuration
Browse files Browse the repository at this point in the history
A new class for deserializing java.time.Instant has been included in the JSON mapper configuration. Also, formatting for datetime strings has been adjusted. These changes improve compatibility of date and time objects with various input formats and enhance the handling of Java 8 Date & Time API in the application.
  • Loading branch information
krharum committed Feb 26, 2024
1 parent 888a15c commit d8a34f0
Showing 1 changed file with 26 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.YearMonth;
Expand All @@ -42,7 +43,8 @@ public ObjectMapper objectMapper() {
.addDeserializer(YearMonth.class, new DollyYearMonthDeserializer())
.addSerializer(YearMonth.class, new YearMonthSerializer(DateTimeFormatter.ofPattern(YEAR_MONTH)))
.addDeserializer(ZonedDateTime.class, new DollyZonedDateTimeDeserializer())
.addSerializer(ZonedDateTime.class, new ZonedDateTimeSerializer(DateTimeFormatter.ISO_DATE_TIME));
.addSerializer(ZonedDateTime.class, new ZonedDateTimeSerializer(DateTimeFormatter.ISO_DATE_TIME))
.addDeserializer(Instant.class, new DollyInstantDeserializer());
return JsonMapper
.builder()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
Expand Down Expand Up @@ -90,7 +92,7 @@ public LocalDate deserialize(JsonParser jsonParser, DeserializationContext deser
}
var dateTime = node.asText().length() > 10 ? node.asText().substring(0, 10) : node.asText();
if (!dateTime.contains("-")) {
dateTime = "%s-%s-%s".formatted(dateTime.substring(0,4), dateTime.substring(4,6), dateTime.substring(6,8));
dateTime = "%s-%s-%s".formatted(dateTime.substring(0, 4), dateTime.substring(4, 6), dateTime.substring(6, 8));
}
return LocalDate.parse(dateTime);
}
Expand All @@ -108,4 +110,26 @@ public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext d
return dateTime.length() > 10 ? LocalDateTime.parse(dateTime) : LocalDate.parse(dateTime).atStartOfDay();
}
}

private static class DollyInstantDeserializer extends JsonDeserializer<Instant> {

/**
* Input format 20210831T101647.269Z or 2021-08-31T10:16:47.269Z
*
*/
@Override
public Instant deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {

JsonNode node = jsonParser.getCodec().readTree(jsonParser);
if (isBlank(node.asText())) {
return null;
}
var instant = node.asText();
if (!instant.contains("-") && instant.length() > 15) {
instant = "%s-%s-%s:%s:%s".formatted(instant.substring(0, 4), instant.substring(4, 6),
instant.substring(6, 11), instant.substring(11, 13), instant.substring(13));
}
return Instant.parse(instant);
}
}
}

0 comments on commit d8a34f0

Please sign in to comment.