Jackson XML反序列化,多态映射

时间:2017-05-02 12:13:22

标签: 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. 我不想使用&#34; subject&#34;为@JsonTypeInfo。相反,我想使用标签名称(突出显示,文本,...)。如何从XML中获取此信息?

  2. @JacksonXmlPropert(localName =&#34; subject&#34;)始终为null,因为我将其用于类型信息。为什么?或者如何绕过它?

  3. 或者方法已经错了?

  4. 最后我使用的是周围的课程:

    @JacksonXmlElementWrapper(localName = "annots")
    @JacksonXmlProperty(localName = "annots")
    
    public List<Annotation> annots;
    

1 个答案:

答案 0 :(得分:0)

我能够使用AnnotationHighlight的正确Text子类型解析此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制作一些内容。