java - Jackson XML 反序列化、多态映射

标签 java xml jackson

我想要反序列化以下 XML(缩短的示例):

<annots>
            <highlight subject="Highlight" page="0">               
                <contents>askdhaskjdhaskjhsakjhdakjshd</contents>
            </highlight>
            <text subject="Comment" page="0" title="Guest" color="#FFFF00">
                <contents>Memo</contents>   
            </text>

</annots>

到目前为止我想出的代码:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "subject")
@JsonSubTypes({
        @JsonSubTypes.Type(name = "Highlight", value = Highlight.class),
        @JsonSubTypes.Type(name = "Comment", value = Text.class)
})

public abstract class Annotation {

    @JacksonXmlProperty(localName = "subject")
    public String subject;

    @JacksonXmlProperty(isAttribute = true,localName = "page")
    public String page;

    @JacksonXmlProperty(isAttribute = true,localName = "rect")
    public String rect;

    @JacksonXmlProperty(isAttribute = true,localName = "flags")
    public String flags;

    @JacksonXmlProperty(isAttribute = true,localName = "name")
    public String name;

    @JacksonXmlProperty(isAttribute = true,localName = "title")
    public String title;

    @JacksonXmlProperty(isAttribute = true,localName = "color")
    public String color;

    @JacksonXmlProperty(isAttribute = true,localName = "opacity")
    public String opacity;

    @JacksonXmlProperty(localName = "contents")
    public String contents;

}

但是这种方法有几个问题:

  1. 我不想对 @JsonTypeInfo 使用“主题”。相反,我想使用标签名称(突出显示、文本……)。我如何从 XML 中获取此信息?

  2. @JacksonXmlPropert(localName = "subject") 始终为 null,因为我将其用于类型信息。为什么?或者如何解决它?

  3. 或者这种方法已经是错误的吗?

最后是我使用的周边类:

@JacksonXmlElementWrapper(localName = "annots")
@JacksonXmlProperty(localName = "annots")

public List<Annotation> annots;

最佳答案

我能够使用 HighlightText 的正确Annotation 子类型以及可见的主题来解析此 xml。我必须指定该属性应该可见:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "subject",
        visible = true)

此外,我使用 jackson 2.8.8 和 woodstox 5.0.3 进行 xml 解析。

上面解决了第 2 点。关于第 1 点,我认为这不能用 @JsonTypeInfo 来完成(如果有的话),因为它的整个想法是显式添加类型信息在生成的 xml 文档中。您也许可以使用 JsonTypeResolver 来解决一些问题.

关于java - Jackson XML 反序列化、多态映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43737609/

相关文章:

java - 从 XPath 表达式获取/列出前缀

在 powershell 中将 XML 转换为 CSV (Spacewalk)

java - 将 JSON 的内存(映射)表示形式转换为 POJO(可能使用 Jackson)

java - Jackon反序列化: how to reference another property?

java - 为什么如果我们重写 Finalize 方法可以增加分配阶段?

java - 如何获取 Firestore 集合中所有文档的名称(字段)?

java - 我如何验证 mer. 2019 年 5 月 1 日按钮?

java - 如何简化if语句?

xml - 导入命名空间的 Eclipse WSDL 验证错误

java - 如何在 JSON 正文中扩展和对象?