2017-05-02 80 views
1

我有下面的XML,我想反序列化(簡稱樣品):傑克遜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」)始終爲空,因爲我將它用於類型信息。爲什麼?或者如何避開它?

  3. 或者是方法已經錯了?

最後周圍的I類使用:

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

public List<Annotation> annots; 

回答

0

我能夠解析這個XML具有正確Annotation子類型的HighlightText和主體可見。我必須指定這個屬性是否是可見的:

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

而且,我使用傑克遜2.8.8和XML解析woodstox 5.0.3。

上面關注的是第2點。關於第1點,我不認爲這可以用@JsonTypeInfo完成,因爲它的整體思路是在生成的xml文檔中明確添加類型信息。你或許可以用JsonTypeResolver解決一些問題。