Last active
April 15, 2016 22:54
-
-
Save varren/032b79976269cf66278f32411a5d1b7c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | |
} | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
3 versons of the same classes than can path the test