BAEL-5849 Code for the improvement of the article Custom deserializer for a generic type jackson
This commit is contained in:
parent
1c3569f2f3
commit
6746ddc7ea
|
@ -0,0 +1,31 @@
|
||||||
|
package com.baeldung.deserialization;
|
||||||
|
|
||||||
|
public class ItemWithWrappedUser {
|
||||||
|
|
||||||
|
public int id;
|
||||||
|
public String itemName;
|
||||||
|
public Wrapper<User> owner;
|
||||||
|
|
||||||
|
public ItemWithWrappedUser() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemWithWrappedUser(final int id, final String itemName, final Wrapper<User> owner) {
|
||||||
|
this.id = id;
|
||||||
|
this.itemName = itemName;
|
||||||
|
this.owner = owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getItemName() {
|
||||||
|
return itemName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wrapper<User> getOwner() {
|
||||||
|
return owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.baeldung.deserialization;
|
||||||
|
|
||||||
|
public class Wrapper<T> {
|
||||||
|
|
||||||
|
T value;
|
||||||
|
|
||||||
|
public T getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(T value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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<Wrapper<?>> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,23 +1,24 @@
|
||||||
package com.baeldung.deserialization;
|
package com.baeldung.deserialization;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonParseException;
|
import static org.hamcrest.CoreMatchers.is;
|
||||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
import static org.hamcrest.CoreMatchers.not;
|
||||||
import com.fasterxml.jackson.databind.JsonMappingException;
|
import static org.hamcrest.Matchers.notNullValue;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import static org.junit.Assert.assertEquals;
|
||||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
import static org.junit.Assert.assertThat;
|
||||||
import com.fasterxml.jackson.databind.module.SimpleModule;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
|
|
||||||
import static org.hamcrest.CoreMatchers.is;
|
import org.junit.Test;
|
||||||
import static org.hamcrest.CoreMatchers.not;
|
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import com.fasterxml.jackson.core.JsonParseException;
|
||||||
import static org.hamcrest.Matchers.notNullValue;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||||
import static org.junit.Assert.assertThat;
|
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 {
|
public class CustomDeserializationUnitTest {
|
||||||
|
|
||||||
|
@ -78,4 +79,23 @@ public class CustomDeserializationUnitTest {
|
||||||
assertThat(restored, is(now));
|
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());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue