diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/Main.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/Main.java new file mode 100644 index 0000000000..eb82c3c4c8 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/Main.java @@ -0,0 +1,50 @@ +package com.baeldung.offsetdatetime; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + +import java.time.OffsetDateTime; + +public class Main { + public static void main(String[] args) throws JsonProcessingException { + System.out.println(serializeUser()); + System.out.println(customSerialize()); + System.out.println(customDeserialize()); + } + + static String serializeUser() throws JsonProcessingException { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.registerModule(new JavaTimeModule()); + + User user = new User(); + user.setCreatedAt(OffsetDateTime.parse("2021-09-30T15:30:00+01:00")); + + return objectMapper.writeValueAsString(user); + } + + static String customSerialize() throws JsonProcessingException { + ObjectMapper objectMapper = new ObjectMapper(); + + objectMapper.registerModule(new SimpleModule().addSerializer(OffsetDateTime.class, new OffsetDateTimeSerializer())); + + User user = new User(); + user.setCreatedAt(OffsetDateTime.parse("2021-09-30T15:30:00+01:00")); + + return objectMapper.writeValueAsString(user); + } + + static String customDeserialize() throws JsonProcessingException { + ObjectMapper objectMapper = new ObjectMapper(); + + objectMapper.registerModule(new SimpleModule().addDeserializer(OffsetDateTime.class, new OffsetDateTimeDeserializer())); + + String jsonString = "{\"createdAt\":\"30-09-2021 15:30:00 +01:00\"}"; + User returnedUser = objectMapper.readValue(jsonString, User.class); + + return returnedUser.getCreatedAt().toString(); + } +} diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/OffsetDateTimeDeserializer.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/OffsetDateTimeDeserializer.java new file mode 100644 index 0000000000..a76d598b8f --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/OffsetDateTimeDeserializer.java @@ -0,0 +1,24 @@ +package com.baeldung.offsetdatetime; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +import java.io.IOException; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; + +public class OffsetDateTimeDeserializer extends JsonDeserializer { + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter + .ofPattern("dd-MM-yyyy HH:mm:ss XXX"); + + @Override + public OffsetDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException { + String dateAsString = jsonParser.getText(); + if (dateAsString == null) { + throw new IOException("OffsetDateTime argument is null."); + } + return OffsetDateTime.parse(dateAsString, DATE_TIME_FORMATTER); + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/OffsetDateTimeSerializer.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/OffsetDateTimeSerializer.java new file mode 100644 index 0000000000..8821f37e8e --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/OffsetDateTimeSerializer.java @@ -0,0 +1,23 @@ +package com.baeldung.offsetdatetime; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; + +public class OffsetDateTimeSerializer extends JsonSerializer { + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter + .ofPattern("dd-MM-yyyy HH:mm:ss XXX"); + + @Override + public void serialize(OffsetDateTime value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) + throws IOException { + if (value == null) { + throw new IOException("OffsetDateTime argument is null."); + } + jsonGenerator.writeString(DATE_TIME_FORMATTER.format(value)); + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/User.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/User.java new file mode 100644 index 0000000000..44978cac87 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/User.java @@ -0,0 +1,18 @@ +package com.baeldung.offsetdatetime; + +import java.time.OffsetDateTime; + +public class User { + private OffsetDateTime createdAt; + + public User() { + } + + public OffsetDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(OffsetDateTime createdAt) { + this.createdAt = createdAt; + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/offsetdatetime/MainUnitTest.java b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/offsetdatetime/MainUnitTest.java new file mode 100644 index 0000000000..553adc8fdf --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/offsetdatetime/MainUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.offsetdatetime; + +import com.fasterxml.jackson.core.JsonProcessingException; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class MainUnitTest { + + @Test + void givenUser_whenSerialized_thenCreatedDateIsSerialized() throws JsonProcessingException { + Assertions.assertEquals("{\"createdAt\":\"2021-09-30T15:30:00+01:00\"}", Main.serializeUser()); + } + + @Test + void givenUser_whenCustomSerialized_thenCreatedDateIsSerialized() throws JsonProcessingException { + Assertions.assertEquals("{\"createdAt\":\"30-09-2021 15:30:00 +01:00\"}", Main.customSerialize()); + } + + @Test + void givenUser_whenCustomDeserialized_thenCreatedDateIsDeserialized() throws JsonProcessingException { + Assertions.assertEquals("2021-09-30T15:30+01:00", Main.customDeserialize()); + } +} \ No newline at end of file diff --git a/jackson-modules/pom.xml b/jackson-modules/pom.xml index 4163d1912f..531d5628f7 100644 --- a/jackson-modules/pom.xml +++ b/jackson-modules/pom.xml @@ -24,11 +24,6 @@ - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - com.fasterxml.jackson.dataformat