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>
|
||||
<!-- marshalling -->
|
||||
<jackson.version>2.9.0</jackson.version>
|
||||
<jackson.version>2.9.2</jackson.version>
|
||||
|
||||
<!-- util -->
|
||||
<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