我想序列化/反序列化这样的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?
由于
答案 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>
在此问题得到解决之前,请考虑第一个选项。如果有字段你不想序列化,请将它们留空。