У меня есть список объектов с общим базовым классом.Я хочу сериализовать (и десериализовать) этот список так, чтобы каждый элемент списка сериализовался с его корневым элементом, равным имени типа, и не иметь обертывающего объекта вокруг элемента.
Я попытался использовать JsonTypeInfo с Id.Name и As.WRAPPER_OBJECT, который создает XML с правильными именами элементов, но (очевидно) с другим слоем XML-элементов (из самого списка).
package zm.study.xmlserialize.jackson;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
public class JacksonListTest4 {
public static class L {
public List<A> as = new ArrayList<>();
}
@JsonTypeInfo(use = Id.NAME, include=As.WRAPPER_OBJECT)
@JsonSubTypes({
@JsonSubTypes.Type(value=B.class, name="b"),
@JsonSubTypes.Type(value=C.class, name="c"),
})
public static abstract class A {
}
public static class B extends A {
}
public static class C extends A {
}
@Test
public void test() throws Exception
{
L l = new L();
l.as.add(new B());
l.as.add(new C());
new XmlMapper().enable(SerializationFeature.INDENT_OUTPUT)
.writeValue(System.out, l);
}
}
Я хотел бы получить:
<L>
<as>
<b/>
<c/>
</as>
</L>
Вместо этого я получаю:
<L>
<as>
<as>
<b/>
</as>
<as>
<c/>
</as>
</as>
</L>