Я хочу десериализовать полиморфные подтипы уровня 2 с помощью аннотаций Джексона. В основном я хочу, чтобы преобразовать следующий JSON в XML с помощью JSON аннотаций и Jacksons следующихDeserialize многоуровневые полиморфные подтипы с использованием аннотаций Джексона
{
"mainSet": {
"name": "bla bla",
"myItems": [
{
"MySubItem": {
"id": 1,
"name": "Value1",
"itemAProperty1": "Some stuff",
"itemAProperty2": "Another property value",
"type": "MySubItemA"
}
},
{
"MySubItem": {
"id": 2,
"name": "Value2",
"itemBProperty1": 1000,
"itemBProperty2": "B property",
"type": "MySubItemB"
}
}
]
}
}
И Final Xml я хочу
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<mainTag schemaVersion="1" xmlns="http://www.utiba.com/xml/ns/brms/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>bla bla</name>
<MySubItem xsi:type="MySubItemA" id="1" name="value1" itemAProperty1="Some stuff" itemAProperty2="Another property value"/>
<MySubItem xsi:type="MySubItemB" id="2" name="value2" itemAProperty1=1000 itemAProperty2="B Property"/>
</mainTag>
Я следующий набор классов - Основной класс
public abstract class MyItem {
private int id;
private String name;
//getter and setter
}
Имеет абстрактный подкласс
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MySubItem")
@XmlSeeAlso({
MySubItemA.class,
MySubItemB.class,
MySubItemC.class
})
public abstract class MySubItem extends MyItem {
private String itemAProperty1;
private String itemAProperty2;
//getter and setter
}
И MySubItem имеют конкретные subclases сказать MySubItemA, MySubItemB, MySubItemC
Теперь, наконец, мы создаем класс клиента, который содержит список объектов абстрактного класса
import java.util.ArrayList;
import java.util.List;
public class MainSet{
@XmlElements({
@XmlElement(name = "MysubItem", type = MySubItem.class),
})
private List<MyItem> myItems;
public List<MyItem> getMyItems() {
return this.myItems;
}
}
Я пытался создать подмешать классы для MyItem как
@JsonTypeInfo(use=Id.MINIMAL_CLASS, include=As.PROPERTY, property="itemType")
@JsonSubTypes({
@Type(MySubItem.class)
})
и для и MySubItem
@JsonTypeInfo(use=Id.MINIMAL_CLASS, include=As.PROPERTY, property="type")
@JsonSubTypes({
@Type(MySubItemA.class)
@Type(MySubItemB.class)
@Type(MySubItemC.class)
})
Ошибки я получаю:
Error parsing JSON from client: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of MySubItem, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information
at [Source: [email protected]; line: 1, column: 498] (through reference chain: bla bla class ["mainSet"]->com.bla.bla["myItems"])
ВЫПУСК: создать класс подмешать для списка myItems, имеющий 2 уровня иерархии абстрактных подклассов
Спасибо Nakul за решение .. Это сработало для меня :) –