jackson XML序列化:继承类的列表

时间:2018-01-08 17:49:34

标签: java xml jackson

我想序列化/反序列化这样的XML:

<Multi>
    <child-001>
        <name/>
        <value/>
    </child-001>
    <child-002>
        <name/>
        <value/>
    </child-002>
</Multi>

其中child-001和child-002是从同一父级继承的类。

public abstract class Parent {
    private String name;
}

@JacksonXmlRootElement(localName = "child-001")
public class Child001 extends Parent {
    private String value;
}

@JacksonXmlRootElement(localName = "child-002")
public class Child002 extends Parent {
    private String value;
}

封装类如下所示:

class Multi {
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Parent> nodes = new ArrayList<>();
}

没有@JacksonXmlElementWrapper(useWrapping = false)我有:

<Multi>
  <nodes>
    <nodes>
      <name>name001</name>
      <value>value001</value>
    </nodes>
    <nodes>
      <name>name002</name>
      <value>value002</value>
    </nodes>
  </nodes>
</Multi>

我已经得到了注释:

<Multi>
  <nodes>
    <name>name001</name>
    <value>value001</value>
  </nodes>
  <nodes>
    <name>name002</name>
    <value>value002</value>
  </nodes>
</Multi>

这非常接近我的需要,但仍然需要替换&#34;节点&#34;用&#34; child-001&#34;和&#34;孩子-002&#34;。

有人能指出我在哪里找到解决方案吗?或者我应该使用JAXB而不是Jackson?

由于

1 个答案:

答案 0 :(得分:1)

通常为了表示exaclty示例XML文件,Multi类看起来应该是这样的,并且效果很好:

class Multi {
    @JacksonXmlProperty(localName = "child-001")
    private Child001 child001;

    @JacksonXmlProperty(localName = "child-002")
    private Child002 child002;
}

在您的代码中,您正在使用父类的List对象,大概是因为您可能将任意数量的元素反序列化为Parent的子类?这是一个需要定义类型信息的多态反序列化的例子。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
        @JsonSubTypes.Type(name = "child-001", value = Child001.class),
        @JsonSubTypes.Type(name = "child-002", value = Child002.class)
})
abstract class Parent {
    private String name;
}

不幸的是,由于还没有(杰克逊2.9.2)未解决issue杰克逊期望围绕每个元素包装,例如。

<Multi>
  <nodes>
    <child-001>
      <name>n1</name>
      <value>v1</value>
    </child-001>
  </nodes>
  <nodes>
    <child-002>
      <name>n2</name>
      <value>v2</value>
    </child-002>
  </nodes>
</Multi>

在此问题得到解决之前,请考虑第一个选项。如果有字段你不想序列化,请将它们留空。