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);
添加回答
舉報