BAEL-1187 - Mapping Nested Values with Jackson (#2750)
* BAEL-1187 - Mapping Nested Values with Jackson * minor naming and formatting changes to align with standards * update formatting and jackson version
This commit is contained in:
parent
d6d6a9edda
commit
3f6dcebdf9
|
@ -129,7 +129,7 @@
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<!-- marshalling -->
|
<!-- marshalling -->
|
||||||
<jackson.version>2.9.0</jackson.version>
|
<jackson.version>2.9.2</jackson.version>
|
||||||
|
|
||||||
<!-- util -->
|
<!-- util -->
|
||||||
<guava.version>19.0</guava.version>
|
<guava.version>19.0</guava.version>
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
package com.baeldung.jackson.deserialization.nested;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.fasterxml.jackson.databind.module.SimpleModule;
|
||||||
|
|
||||||
|
public class DeserializeWithNestedPropertiesUnitTest {
|
||||||
|
|
||||||
|
private String SOURCE_JSON = "{\"id\":\"957c43f2-fa2e-42f9-bf75-6e3d5bb6960a\",\"name\":\"The Best Product\",\"brand\":{\"id\":\"9bcd817d-0141-42e6-8f04-e5aaab0980b6\",\"name\":\"ACME Products\",\"owner\":{\"id\":\"b21a80b1-0c09-4be3-9ebd-ea3653511c13\",\"name\":\"Ultimate Corp, Inc.\"}}}";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingJacksonAnnotations_thenOk() throws IOException {
|
||||||
|
Product product = new ObjectMapper().readerFor(Product.class)
|
||||||
|
.readValue(SOURCE_JSON);
|
||||||
|
|
||||||
|
assertEquals(product.getName(), "The Best Product");
|
||||||
|
assertEquals(product.getBrandName(), "ACME Products");
|
||||||
|
assertEquals(product.getOwnerName(), "Ultimate Corp, Inc.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingJacksonJsonNode_thenOk() throws IOException {
|
||||||
|
JsonNode productNode = new ObjectMapper().readTree(SOURCE_JSON);
|
||||||
|
|
||||||
|
Product product = new Product();
|
||||||
|
product.setId(productNode.get("id")
|
||||||
|
.textValue());
|
||||||
|
product.setName(productNode.get("name")
|
||||||
|
.textValue());
|
||||||
|
product.setBrandName(productNode.get("brand")
|
||||||
|
.get("name")
|
||||||
|
.textValue());
|
||||||
|
product.setOwnerName(productNode.get("brand")
|
||||||
|
.get("owner")
|
||||||
|
.get("name")
|
||||||
|
.textValue());
|
||||||
|
|
||||||
|
assertEquals(product.getName(), "The Best Product");
|
||||||
|
assertEquals(product.getBrandName(), "ACME Products");
|
||||||
|
assertEquals(product.getOwnerName(), "Ultimate Corp, Inc.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingJacksonDeserializerManuallyRegistered_thenOk() throws IOException {
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
SimpleModule module = new SimpleModule();
|
||||||
|
module.addDeserializer(Product.class, new ProductDeserializer());
|
||||||
|
mapper.registerModule(module);
|
||||||
|
|
||||||
|
Product product = mapper.readValue(SOURCE_JSON, Product.class);
|
||||||
|
assertEquals(product.getName(), "The Best Product");
|
||||||
|
assertEquals(product.getBrandName(), "ACME Products");
|
||||||
|
assertEquals(product.getOwnerName(), "Ultimate Corp, Inc.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingJacksonDeserializerAutoRegistered_thenOk() throws IOException {
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
Product product = mapper.readValue(SOURCE_JSON, Product.class);
|
||||||
|
assertEquals(product.getName(), "The Best Product");
|
||||||
|
assertEquals(product.getBrandName(), "ACME Products");
|
||||||
|
assertEquals(product.getOwnerName(), "Ultimate Corp, Inc.");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
package com.baeldung.jackson.deserialization.nested;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
|
|
||||||
|
@JsonDeserialize(using = ProductDeserializer.class)
|
||||||
|
public class Product {
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
private String name;
|
||||||
|
private String brandName;
|
||||||
|
private String ownerName;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBrandName() {
|
||||||
|
return brandName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBrandName(String brandName) {
|
||||||
|
this.brandName = brandName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOwnerName() {
|
||||||
|
return ownerName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOwnerName(String ownerName) {
|
||||||
|
this.ownerName = ownerName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@JsonProperty("brand")
|
||||||
|
private void unpackNested(Map<String, Object> brand) {
|
||||||
|
this.brandName = (String) brand.get("name");
|
||||||
|
Map<String, String> owner = (Map<String, String>) brand.get("owner");
|
||||||
|
this.ownerName = owner.get("name");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
package com.baeldung.jackson.deserialization.nested;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonParser;
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.DeserializationContext;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
|
||||||
|
|
||||||
|
@SuppressWarnings("serial")
|
||||||
|
public class ProductDeserializer extends StdDeserializer<Product> {
|
||||||
|
|
||||||
|
public ProductDeserializer() {
|
||||||
|
this(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductDeserializer(Class<?> vc) {
|
||||||
|
super(vc);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Product deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
|
||||||
|
JsonNode productNode = jp.getCodec()
|
||||||
|
.readTree(jp);
|
||||||
|
Product product = new Product();
|
||||||
|
product.setId(productNode.get("id")
|
||||||
|
.textValue());
|
||||||
|
product.setName(productNode.get("name")
|
||||||
|
.textValue());
|
||||||
|
product.setBrandName(productNode.get("brand")
|
||||||
|
.get("name")
|
||||||
|
.textValue());
|
||||||
|
product.setOwnerName(productNode.get("brand")
|
||||||
|
.get("owner")
|
||||||
|
.get("name")
|
||||||
|
.textValue());
|
||||||
|
return product;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue