Skip to content

Instantly share code, notes, and snippets.

@varren
Last active April 15, 2016 22:54
Show Gist options
  • Save varren/032b79976269cf66278f32411a5d1b7c to your computer and use it in GitHub Desktop.
Save varren/032b79976269cf66278f32411a5d1b7c to your computer and use it in GitHub Desktop.
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Objects;
public class TestClass {
@Test
public void testBoth() throws IOException, URISyntaxException {
ClassLoader classLoader = getClass().getClassLoader();
String json = "{\n" +
" \"classA\":{\n" +
" \"aField\":\"A\",\n" +
" \"baseField\":\"baseA\"\n" +
" },\n" +
" \"classB\":{\n" +
" \"baseField\":\"baseB\",\n" +
" \"bField\":\"B\"\n" +
" }\n" +
"}";//new String(Files.readAllBytes(Paths.get(classLoader.getResource("test/so-example.json").toURI())));
ObjectMapper mapper = new ObjectMapper();
mapper.registerSubtypes(SubClassA.class, SubClassB.class);
SubClassTestObject testObj = mapper.readValue(json, SubClassTestObject.class); //Fails here
SubClassA a = testObj.getA();
SubClassB b = testObj.getB();
assertTrue(a.getBaseField().equals("baseA"));
assertTrue(b.getBaseField().equals("baseB"));
assertTrue(a.getaField().equals("A"));
assertTrue(b.getbField().equals("B"));
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
@JsonSubTypes.Type(value = SubClassA.class, name = "classA"),
@JsonSubTypes.Type(value = SubClassB.class, name = "classB")
})
@JsonIgnoreProperties(ignoreUnknown = true)
public static abstract class AbstractSimpleClass {
String baseField;
public String getBaseField() {
return baseField;
}
public void setBaseField(String baseField) {
this.baseField = baseField;
}
}
public static class SubClassA extends AbstractSimpleClass {
String aField;
public String getaField() {
return aField;
}
public void setaField(String aField) {
this.aField = aField;
}
}
public static class SubClassB extends AbstractSimpleClass {
String bField;
public String getbField() {
return bField;
}
public void setbField(String bField) {
this.bField = bField;
}
}
@JsonIgnoreProperties(ignoreUnknown = true)
public static class SubClassTestObject {
SubClassA a;
SubClassB b;
public SubClassA getA() {
return a;
}
public void setA(SubClassA a) {
this.a = a;
}
public SubClassB getB() {
return b;
}
public void setB(SubClassB b) {
this.b = b;
}
@JsonAnySetter
public void jsonAnySetter(String key, JsonNode obj) {
if (Objects.equals(key, "classA")) {
a = new SubClassA();
a.setaField(obj.get("aField").asText());
a.setBaseField(obj.get("baseField").asText());
}else if (Objects.equals(key, "classB")) {
b = new SubClassB();
b.setbField(obj.get("bField").asText());
b.setBaseField(obj.get("baseField").asText());
}
}
}
}
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.net.URISyntaxException;
public class TestClass {
@Test
public void testBoth() throws IOException, URISyntaxException {
ClassLoader classLoader = getClass().getClassLoader();
String json = "{\n" +
" \"classA\":{\n" +
" \"aField\":\"A\",\n" +
" \"baseField\":\"baseA\"\n" +
" },\n" +
" \"classB\":{\n" +
" \"baseField\":\"baseB\",\n" +
" \"bField\":\"B\"\n" +
" }\n" +
"}";//new String(Files.readAllBytes(Paths.get(classLoader.getResource("test/so-example.json").toURI())));
ObjectMapper mapper = new ObjectMapper();
mapper.registerSubtypes(SubClassA.class, SubClassB.class);
SubClassTestObject testObj = mapper.readValue(json, SubClassTestObject.class); //Fails here
SubClassA a = testObj.getA();
SubClassB b = testObj.getB();
assertTrue(a.getBaseField().equals("baseA"));
assertTrue(b.getBaseField().equals("baseB"));
assertTrue(a.getaField().equals("A"));
assertTrue(b.getbField().equals("B"));
}
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
@JsonSubTypes.Type(value = SubClassA.class, name = "classA"),
@JsonSubTypes.Type(value = SubClassB.class, name = "classB")
})
@JsonIgnoreProperties(ignoreUnknown = true)
public static abstract class AbstractSimpleClass {
String baseField;
public String getBaseField() {
return baseField;
}
public void setBaseField(String baseField) {
this.baseField = baseField;
}
}
public static class SubClassA extends AbstractSimpleClass {
String aField;
public String getaField() {
return aField;
}
public void setaField(String aField) {
this.aField = aField;
}
}
public static class SubClassB extends AbstractSimpleClass {
String bField;
public String getbField() {
return bField;
}
public void setbField(String bField) {
this.bField = bField;
}
}
@JsonIgnoreProperties(ignoreUnknown = true)
public static class SubClassTestObject {
@JsonProperty("classA")
@JsonTypeInfo(use=JsonTypeInfo.Id.NONE)
SubClassA a;
@JsonProperty("classB")
@JsonTypeInfo(use=JsonTypeInfo.Id.NONE)
SubClassB b;
public SubClassA getA() {
return a;
}
public void setA(SubClassA a) {
this.a = a;
}
public SubClassB getB() {
return b;
}
public void setB(SubClassB b) {
this.b = b;
}
}
}
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.net.URISyntaxException;
public class TestClassv2 {
@Test
public void testBoth() throws IOException, URISyntaxException {
ClassLoader classLoader = getClass().getClassLoader();
String json = "{\n" +
" \"classA\":{\n" +
" \"aField\":\"A\",\n" +
" \"baseField\":\"baseA\"\n" +
" },\n" +
" \"classB\":{\n" +
" \"baseField\":\"baseB\",\n" +
" \"bField\":\"B\"\n" +
" }\n" +
"}";//new String(Files.readAllBytes(Paths.get(classLoader.getResource("test/so-example.json").toURI())));
ObjectMapper mapper = new ObjectMapper();
mapper.registerSubtypes(SubClassA.class, SubClassB.class);
SubClassTestObject testObj = mapper.readValue(json, SubClassTestObject.class); //Fails here
SubClassA a = testObj.getA();
SubClassB b = testObj.getB();
assertTrue(a.getBaseField().equals("baseA"));
assertTrue(b.getBaseField().equals("baseB"));
assertTrue(a.getaField().equals("A"));
assertTrue(b.getbField().equals("B"));
}
@JsonIgnoreProperties(ignoreUnknown = true)
public static abstract class AbstractSimpleClass {
String baseField;
public String getBaseField() {
return baseField;
}
public void setBaseField(String baseField) {
this.baseField = baseField;
}
}
public static class SubClassA extends AbstractSimpleClass {
String aField;
public String getaField() {
return aField;
}
public void setaField(String aField) {
this.aField = aField;
}
}
public static class SubClassB extends AbstractSimpleClass {
String bField;
public String getbField() {
return bField;
}
public void setbField(String bField) {
this.bField = bField;
}
}
@JsonIgnoreProperties(ignoreUnknown = true)
public static class SubClassTestObject {
@JsonProperty("classA")
SubClassA a;
@JsonProperty("classB")
SubClassB b;
public SubClassA getA() {
return a;
}
public void setA(SubClassA a) {
this.a = a;
}
public SubClassB getB() {
return b;
}
public void setB(SubClassB b) {
this.b = b;
}
}
}
@varren
Copy link
Author

varren commented Apr 15, 2016

3 versons of the same classes than can path the test

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment