From b07c2ef9e7988e47887d6da06f043598160023ae Mon Sep 17 00:00:00 2001 From: "thibault.faure" Date: Sun, 20 Nov 2022 17:47:16 +0100 Subject: [PATCH] BAEL-5849 Code for the improvement of the article Custom deserializer for a generic type jackson --- .../deserialization/ItemWithWrappedUser.java | 31 +++++++++++++ .../com/baeldung/deserialization/Wrapper.java | 15 ++++++ .../deserialization/WrapperDeserializer.java | 30 ++++++++++++ .../CustomDeserializationUnitTest.java | 46 +++++++++++++------ 4 files changed, 109 insertions(+), 13 deletions(-) create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemWithWrappedUser.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Wrapper.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/WrapperDeserializer.java diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemWithWrappedUser.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemWithWrappedUser.java new file mode 100644 index 0000000000..827d7dd768 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemWithWrappedUser.java @@ -0,0 +1,31 @@ +package com.baeldung.deserialization; + +public class ItemWithWrappedUser { + + public int id; + public String itemName; + public Wrapper owner; + + public ItemWithWrappedUser() { + super(); + } + + public ItemWithWrappedUser(final int id, final String itemName, final Wrapper owner) { + this.id = id; + this.itemName = itemName; + this.owner = owner; + } + + public int getId() { + return id; + } + + public String getItemName() { + return itemName; + } + + public Wrapper getOwner() { + return owner; + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Wrapper.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Wrapper.java new file mode 100644 index 0000000000..a9baa52277 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Wrapper.java @@ -0,0 +1,15 @@ +package com.baeldung.deserialization; + +public class Wrapper { + + T value; + + public T getValue() { + return value; + } + + public void setValue(T value) { + this.value = value; + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/WrapperDeserializer.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/WrapperDeserializer.java new file mode 100644 index 0000000000..e6a4bea0d6 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/WrapperDeserializer.java @@ -0,0 +1,30 @@ +package com.baeldung.deserialization; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.deser.ContextualDeserializer; + +public class WrapperDeserializer extends JsonDeserializer> implements ContextualDeserializer { + + private JavaType type; + + @Override + public JsonDeserializer createContextual(DeserializationContext ctxt, BeanProperty property) { + this.type = property.getType() + .containedType(0); + return this; + } + + @Override + public Wrapper deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { + Wrapper wrapper = new Wrapper<>(); + wrapper.setValue(deserializationContext.readValue(jsonParser, type)); + return wrapper; + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/deserialization/CustomDeserializationUnitTest.java b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/deserialization/CustomDeserializationUnitTest.java index 17016149a2..b32121dbed 100644 --- a/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/deserialization/CustomDeserializationUnitTest.java +++ b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/deserialization/CustomDeserializationUnitTest.java @@ -1,23 +1,24 @@ package com.baeldung.deserialization; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.module.SimpleModule; -import org.junit.Test; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; import java.io.IOException; import java.time.ZoneId; import java.time.ZonedDateTime; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.module.SimpleModule; public class CustomDeserializationUnitTest { @@ -78,4 +79,23 @@ public class CustomDeserializationUnitTest { assertThat(restored, is(now)); } + @Test + public void whenDeserialisingItemWithWrappedUser_ThenWrappedUserIsCorrectlyParsed() throws JsonProcessingException { + final String json = "{\"id\":1,\"itemName\":\"theItem\",\"owner\":{\"id\":2,\"name\":\"theUser\"}}"; + + SimpleModule module = new SimpleModule().addDeserializer(Wrapper.class, new WrapperDeserializer()); + + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.registerModule(module); + + final ItemWithWrappedUser readValue = objectMapper.readValue(json, ItemWithWrappedUser.class); + + assertEquals(2, readValue.getOwner() + .getValue() + .getId()); + assertEquals("theUser", readValue.getOwner() + .getValue() + .getName()); + } + }