2017-05-04 77 views
1

鑑於XML在下面的(簡化的)格式:反序列化內部部分

<outer><inner><field1>a</field1><field2>b</field2><field3>c</field3></inner></outer> 

我想的<inner>元件反序列化爲代表一個類而丟棄其餘部分。

public class Inner { 
    private String field1; 
    private String field2; 
    private String field3; 
    // getters, setters, ctor 
} 

我正在使用Jackson XmlMapper類來執行反序列化。如果我將<outer>從xml字符串中剝離出來,顯然它可以工作。

XmlMapper xmlMapper = new XmlMapper(); 
// in my scenario the `<inner>` element actually contains fields I don't care about 
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
Inner inner = xmlMapper.readValue(xml, Inner.class); 
System.out.println(inner); 
// Inner(field1=a, field2=b, field3=c) 

如果我離開<outer>元素都在inner字段爲空。

我試過用@JacksonXmlRootElement(localName = "inner")註解Inner類,但是這並沒有改變輸出。

我可以創建一個代表<outer>元素的類,但這看起來很浪費。我大概也可以創建一個包含<inner>元素之間的xml的新字符串,但是再次感覺有點冒險。

在我的情況下,xml被一個單獨的系統廣播,我無法控制,所以我可以簡單地修改xml結構。

是否有可能將「內部」xml反序列化爲新的類實例?

回答

1

看來,@JacksonXmlRootElement(localName = "inner")正如你所期望的那樣工作,你還需要UNWRAP_ROOT_VALUE。例如。

xmlMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 

我不能說上面的文檔非常明顯。

+0

謝謝。看來這個功能是關鍵。 –