java - Jackson XML 解码和抽象类

标签 java xml jaxb jackson

我正在尝试使用 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/

相关文章:

java - IllegalAnnotationsException SetMultimap 是一个接口(interface),JAXB 无法处理接口(interface)

java - 使用 substitutionGroup 的 JAXB 继承在解码时不起作用

java - Eclipse 错误 : no jogl in java. 库.路径

java - Maven使用ftp进行war上传

xml - 我可以创建一个 XSD 模式,将属性放在所有复杂类型上吗?

php - 创建一个 XML 文件来存储权限并使用 PHP 解析它以创建一个列表

java - 在 Java 中使用 JAXB 序列化树结构

java - 多 J2EE 应用程序系统中具有惰性字段的实体的最佳实践

Java:使用 Inject 注释对类进行 Junit

xml - 具有多个子节点的 Oracle XML 查询