【发布时间】:2016-04-14 19:01:51
【问题描述】:
我正在尝试做一个将 json 反序列化为多态类的简单示例。反序列化失败并出现错误:
org.codehaus.jackson.map.JsonMappingException: Could not resolve type id 'aField' into a subtype of [simple type, class ...SubClassA]
如果我尝试对单个子类进行反序列化,只使用该类的 JSON,它会成功,但是当我将两个类放在 SubClassTestObject 中时,它会失败。有什么想法可以解决这个问题吗?我需要编写自定义反序列化器吗?
这是我的 JSON:
{
"classA":{
"aField":"A",
"baseField":"baseA"
},
"classB":{
"baseField":"baseB",
"bField":"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 abstract class AbstractSimpleClass {
String baseField;
public String getBaseField() {
return baseField;
}
public void setBaseField(String baseField) {
this.baseField = baseField;
}
}
public class SubClassA extends AbstractSimpleClass {
String aField;
public String getaField() {
return aField;
}
public void setaField(String aField) {
this.aField = aField;
}
}
public class SubClassB extends AbstractSimpleClass {
String bField;
public String getbField() {
return bField;
}
public void setbField(String bField) {
this.bField = bField;
}
}
@JsonIgnoreProperties(ignoreUnknown = true)
public 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;
}
}
这是我的测试:
@Test
public void testBoth() throws IOException, URISyntaxException {
ClassLoader classLoader = getClass().getClassLoader();
json = 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"));
}
【问题讨论】:
-
更新问题...
-
以后,请在发布问题前检查您的问题。这是一个非常不同的场景。
-
我的错,在看到第一个答案后,我看到了其中一个问题,所以我修复了它,它变成了另一个问题。
-
您想在
SubClassTestObject中使用类型信息吗?还是碰巧您只有这样的类,并且您确切知道 SubClassTestObject { SubClassA a; 中期望的类型是什么? SubClassB b;} 因为你可以把@JsonTypeInfo(use=JsonTypeInfo.Id.NONE)放在SubClassA和SubClassB上面,这段代码对你有用 -
您只能更改
public class SubClassTestObject { @JsonProperty("classA") @JsonTypeInfo(use=JsonTypeInfo.Id.NONE) SubClassA a; @JsonProperty("classB") @JsonTypeInfo(use=JsonTypeInfo.Id.NONE) SubClassB b;}并且您提供的其余代码都可以使用,但是您根本不需要输入信息
标签: java json jackson polymorphism deserialization