Вот как определить наследование со многими уровнями:
Вы хотите десериализовать список GrandParent, конечный тип которого - "child"
{
"list":[{
"type": "child",
"someProperty": "foobar"
}]
}
и дерево наследования:
GrandParent
Parent
Child(someProperty:String)
Вы должны определить свой атрибут "type" на верхнем уровне, @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 вы установили имя типа родителя в аннотации: важен только тип листа, остальная часть дерева вычитается.
Боковой узел: Assertions
от junit5, он делает то же самое, что Assert
от junit4