如何在Jackson中使用元素类型名称作为xml元素名称序列化多态列表

时间:2019-02-15 20:50:04

标签: jackson-dataformat-xml

我有一个具有共同基类的对象列表。我希望序列化(和反序列化)此列表,以便每个列表元素都以其根元素与类型名称相同的方式序列化,并且在该元素周围没有包装对象。

我尝试将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>

1 个答案:

答案 0 :(得分:0)

如果知道自己想要什么,最好编写XSD,然后使用JAXB之类的工具来创建序列化/反序列化Java对象。