2

给定以下(简化)格式的 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
}

我正在使用 JacksonXmlMapper类来执行反序列化。如果我去掉<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 反序列化为新的类实例?

4

1 回答 1

2

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

xmlMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);

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

于 2017-05-05T13:38:14.597 回答