将 XML 的内部反序列化为新的 class 实例
Deserialize inner portion of XML into new class instance
给定 XML 以下(简化)格式:
<outer><inner><field1>a</field1><field2>b</field2><field3>c</field3></inner></outer>
我想将 <inner>
元素反序列化为表示该元素的 class 并丢弃其余元素。
public class Inner {
private String field1;
private String field2;
private String field3;
// getters, setters, ctor
}
我正在使用 Jackson XmlMapper
class 来执行反序列化。如果我从 xml 字符串中删除 <outer>
显然它有效。
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
class 但这并没有改变输出。
我可以创建一个 class 来表示 <outer>
元素,但这似乎很浪费。我可能还可以创建一个新字符串,其中仅包含 <inner>
元素之间的 xml,但同样感觉有点老套。
在我的例子中,xml 由我无法控制的单独系统广播,因此我可以简单地修改 xml 结构。
是否可以将 "inner" xml 反序列化为新的 class 实例?
看来 @JacksonXmlRootElement(localName = "inner")
要像您期望的那样工作,您还需要 UNWRAP_ROOT_VALUE。例如
xmlMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
我不能说上面的内容从文档中很明显。
给定 XML 以下(简化)格式:
<outer><inner><field1>a</field1><field2>b</field2><field3>c</field3></inner></outer>
我想将 <inner>
元素反序列化为表示该元素的 class 并丢弃其余元素。
public class Inner {
private String field1;
private String field2;
private String field3;
// getters, setters, ctor
}
我正在使用 Jackson XmlMapper
class 来执行反序列化。如果我从 xml 字符串中删除 <outer>
显然它有效。
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
class 但这并没有改变输出。
我可以创建一个 class 来表示 <outer>
元素,但这似乎很浪费。我可能还可以创建一个新字符串,其中仅包含 <inner>
元素之间的 xml,但同样感觉有点老套。
在我的例子中,xml 由我无法控制的单独系统广播,因此我可以简单地修改 xml 结构。
是否可以将 "inner" xml 反序列化为新的 class 实例?
看来 @JacksonXmlRootElement(localName = "inner")
要像您期望的那样工作,您还需要 UNWRAP_ROOT_VALUE。例如
xmlMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
我不能说上面的内容从文档中很明显。