我正在尝试使用 Jackson 2.4.0 XmlMapper
解码以下 XML:
<root>
<a/>
<b/>
</root>
...以及以下 POJO
class Root {
@JacksonXmlElementWrapper(useWrapping = false)
@JsonSubTypes({
@JsonSubTypes.Type(name = "a", value = POJO_A.class),
@JsonSubTypes.Type(name = "b", value = POJO_B.class)
})
public final List<AbstractPOJO> objects = new ArrayList<>();
}
我还尝试使用 JAXB @XmlElements
注释,得到相同的结果,即:
Unrecognized field "a" (class Root), not marked as ignorable (1 known properties: "objects"])
看来 jackson 认为我的列表被称为“对象”而不是“a”和“b”。通常我通过使用 @JsonProperty("newName")
来解决这个问题,但在这种情况下,我希望由 @JsonSubtypes
或 @XmlElements
处理> 注释。
由于我无法修改输入 XML,因此我可以使用 Jackson、Jackson XML 或 JAXB 注释执行其他操作吗?
更新:忘了说,问题是反序列化到同一个集合(因为我需要保持顺序并且它们可以混合)。在不同的字段中执行此操作效果很好。
最佳答案
当我尝试 peeskillet 答案并将 Jackson 更改为 JAXB 解码器时,使用 @XmlElements
/@XmlElementRefs
有效(@XmlAnyElement
不适用于出于某种原因,我得到了 ElementNSImpl
列表,而不是我自己的类)。
很高兴能与 Jackson 合作,但与此同时,这就是实现这项工作的方式。
更新:
我所做的是:
class Root {
@XmlElements({
@XmlElement(name = "a", type = PojoA.class),
@XmlElement(name = "b", type = PojoB.class)
})
public final List<AbstractPOJO> objects = new ArrayList<>();
}
我还向 PojoA
添加了 @XmlRootElement(name = "a")
,但我认为当您有 @XmlElements
时不会使用它>
关于java - Jackson XML 解码和抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25973188/