将XML的内部反序列化为新的类实例

时间:2017-05-04 16:00:01

标签: java jackson jackson-dataformat-xml

以下列(简化)格式给出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中的所有字段都为空。

我尝试使用Inner注释@JacksonXmlRootElement(localName = "inner")类,但这并没有改变输出。

我可以创建一个代表<outer>元素的类,但这似乎很浪费。我可能还可以创建一个新的字符串,其中只包含<inner>元素之间的xml,但这又感觉有点hacky。

在我的情况下,xml是由我无法控制的单独系统广播的,所以我可以简单地修改xml结构。

是否可以将“内部”xml反序列化为新的类实例?

1 个答案:

答案 0 :(得分:1)

似乎@JacksonXmlRootElement(localName = "inner")按预期工作,您还需要UNWRAP_ROOT_VALUE。 E.g。

xmlMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);

我不能说上述内容在文档中非常明显。