From b0a84c94d219b5a091727a76aadb65e895a32e4b Mon Sep 17 00:00:00 2001 From: Forb Yuan Date: Mon, 3 Apr 2023 20:47:51 -0700 Subject: [PATCH] [BAEL-6203] Deserialize Generic Type with Jackson (#13764) --- .../jsongeneric/JsonResponse.java | 14 +++++++ .../deserialization/jsongeneric/User.java | 33 +++++++++++++++ .../GenericTypeDeserializerUnitTest.java | 40 +++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/deserialization/jsongeneric/JsonResponse.java create mode 100644 jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/deserialization/jsongeneric/User.java create mode 100644 jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/deserialization/jsongeneric/GenericTypeDeserializerUnitTest.java diff --git a/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/deserialization/jsongeneric/JsonResponse.java b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/deserialization/jsongeneric/JsonResponse.java new file mode 100644 index 0000000000..14f6b3f8ad --- /dev/null +++ b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/deserialization/jsongeneric/JsonResponse.java @@ -0,0 +1,14 @@ +package com.baeldung.jackson.deserialization.jsongeneric; + +public class JsonResponse { + + private T result; + + public T getResult() { + return result; + } + + public void setResult(T result) { + this.result = result; + } +} diff --git a/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/deserialization/jsongeneric/User.java b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/deserialization/jsongeneric/User.java new file mode 100644 index 0000000000..1efb3af7f9 --- /dev/null +++ b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/deserialization/jsongeneric/User.java @@ -0,0 +1,33 @@ +package com.baeldung.jackson.deserialization.jsongeneric; + +public class User { + + private Long id; + private String firstName; + private String lastName; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} + diff --git a/jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/deserialization/jsongeneric/GenericTypeDeserializerUnitTest.java b/jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/deserialization/jsongeneric/GenericTypeDeserializerUnitTest.java new file mode 100644 index 0000000000..24baeb7f1f --- /dev/null +++ b/jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/deserialization/jsongeneric/GenericTypeDeserializerUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.jackson.deserialization.jsongeneric; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class GenericTypeDeserializerUnitTest { + + ObjectMapper objectMapper = new ObjectMapper(); + + @Test + void givenJsonObject_whenDeserializeIntoGenericTypeByTypeReference_thenCorrect() throws JsonProcessingException { + String json = "{\"result\":{\"id\":1,\"firstName\":\"John\",\"lastName\":\"Lewis\"}}"; + + TypeReference> typeRef = new TypeReference>() {}; + JsonResponse jsonResponse = objectMapper.readValue(json, typeRef); + User user = jsonResponse.getResult(); + + assertThat(user.getId()).isEqualTo(1); + assertThat(user.getFirstName()).isEqualTo("John"); + assertThat(user.getLastName()).isEqualTo("Lewis"); + } + + @Test + void givenJsonObject_whenDeserializeIntoGenericTypeByJavaType_thenCorrect() throws JsonProcessingException { + String json = "{\"result\":{\"id\":1,\"firstName\":\"John\",\"lastName\":\"Lewis\"}}"; + + JavaType javaType = objectMapper.getTypeFactory().constructParametricType(JsonResponse.class, User.class); + JsonResponse jsonResponse = objectMapper.readValue(json, javaType); + User user = jsonResponse.getResult(); + + assertThat(user.getId()).isEqualTo(1); + assertThat(user.getFirstName()).isEqualTo("John"); + assertThat(user.getLastName()).isEqualTo("Lewis"); + } +} \ No newline at end of file