2017-05-04 46 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

谢谢。看来这个功能是关键。 –