2 回答
TA贡献1843条经验 获得超7个赞
以下是如何定义具有多个级别的继承:
您想要反序列化最终类型为“child”的 GrandParent 列表
{
"list":[{
"type": "child",
"someProperty": "foobar"
}]
}
继承树是:
GrandParent
Parent
Child(someProperty:String)
您必须在顶层定义您的“类型”属性,@JsonTypeInfo(...) 您可以在子级别上重复它,但如果您只序列化/反序列化祖父母则不需要。然后在每个父级(类 Parent 和 GrandParent)上定义子类型,就像您对 @JsonSubTypes 所做的那样。
代码
public class JacksonInheritanceTest2 {
@Test
public void deserializeChildrenAsGrandParentList() throws IOException {
ObjectMapper mapper = new ObjectMapper();
String grandparentsJson = "{" +
"\"list\":[{" +
"\"type\": \"child\"," +
"\"someProperty\": \"foobar\"" +
"}]" +
"}";
GrandParentList grandparents = mapper.readValue(grandparentsJson, GrandParentList.class);
Assertions.assertNotNull(grandparents);
}
}
class GrandParentList {
@JsonProperty
List<GrandParent> list;
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Parent.class,name = "parent"),
//@JsonSubTypes.Type(value = Child.class, name = "child")
})
class GrandParent {
@JsonProperty("type")
private String type;
}
//@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = Child.class, name = "child")
})
class Parent extends GrandParent {
@JsonProperty
private String value;
}
@JsonSubTypes({
@JsonSubTypes.Type(value = Child.class, name = "child")
})
class Child extends Parent {
@JsonProperty
private String someProperty;
public String getSomeProperty() {
return someProperty;
}
public void setSomeProperty(String someProperty) {
this.someProperty = someProperty;
}
}
你做的错误:
定义许多属性类型名称,每个属性类型名称用于一个父级:您选择您的属性类型名称并仅使用一个。
在 Json 中,您确实在抽象中设置了父级的类型名称:只有叶类型很重要,树的其余部分被扣除。
侧节点:来自 junit5,它与来自 junit4 的Assertions
功能相同Assert
TA贡献1856条经验 获得超17个赞
在 ObjectMapper 对象上设置配置:
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
添加回答
举报