我正在尝试反序列化以下XML:
<root>
<foo name="AAA" />
<bar name="BBB" />
<foo name="CCC" />
</root>
我的杰克逊课程是:
@Data
public class Foo {
@JacksonXmlProperty(isAttribute = true)
private String name;
}
酒吧是相同的,只是一个不同的类名。(在实际代码中,它们是不同的,这只是一个示例)。
根类是
@Data
public class Root {
@JacksonXmlProperty(localName = "foo")
@JacksonXmlElementWrapper(useWrapping = false)
private List<Foo> foos;
@JacksonXmlProperty(localName = "bar")
@JacksonXmlElementWrapper(useWrapping = false)
private List<Bar> bars;
}
当我尝试反序列化XML时,使用此代码
System.out.println(new XmlMapper().readValue(theXml, Root.class));
结果是这样(注意缺少“ AAA”):
Root(foos=[Foo(name=CCC)], bars=[Bar(name=BBB)])
但是,如果我移动XML中的字段,使两个foo
标签彼此相邻,则会打印
Root(foos=[Foo(name=AAA), Foo(name=CCC)], bars=[Bar(name=BBB)])
我正在使用最新的jackson-dataformat-xml 2.11.1。
这是怎么回事,我该如何解决?
对于任何属性,您都可以使用Jackson注释(JsonSetter和JsonGetter)指定一种用作设置器或获取器的方法。当您只需要对Jackson的操作进行一些修改时,那么为整个类编写自定义deserializer
/ 似乎更容易serializer
。杰克逊还有一个JsonAnySetter批注,该批注用于在类中未指定的内容(我发现有时很方便;我已使用它将一种元素类型的所有XML属性放入单个Map中,而不是而不是必须为每个可能的属性都具有属性)。
您可以在Root类中添加自定义XML反序列化方法。像这样:
@JsonSetter(value = "foo")
public void setFooFromXml(Foo foo) {
if (this.foos == null) {
this.foos = new ArrayList<Foo>();
}
this.foos.add(foo);
}
@JsonSetter(value = "bar")
public void setBarFromXml(Bar bar) {
if (this.bars == null) {
this.bars = new ArrayList<Bar>();
}
this.bars.add(bar);
}
使用Jackson来反序列化XML,如下所示:
try {
String input = "<root><foo name=\"AAA\" /><bar name=\"BBB\" /><foo name=\"CCC\" /></root>";
XmlMapper mapper = new XmlMapper();
Root root = mapper.readValue(input, Root.class);
System.out.println(root.getBars());
System.out.println(root.getFoos());
} catch (Exception e) {
e.printStackTrace();
}
给出此输出(在添加一些简单的toString()和getter方法之后):
[Bar [name=BBB]]
[Foo [name=AAA], Foo [name=CCC]]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句