gpt4 book ai didi

java - 使用多个 useWrapping = false 时,Jackson XML 反序列化会跳过字段

转载 作者:行者123 更新时间:2023-12-01 09:57:23 27 4
gpt4 key购买 nike

我正在尝试反序列化以下 XML:

<root>
<foo name="AAA" />
<bar name="BBB" />
<foo name="CCC" />
</root>
我的 jackson 类(class)是:
@Data
public class Foo {
@JacksonXmlProperty(isAttribute = true)
private String name;
}
Bar 是相同的,只是类名不同。 (在实际代码中它们是不同的,这只是一个示例)。
根类是
@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 注释( JsonSetterJsonGetter )指定一个方法来用作 setter 或 getter。当您只需要对 Jackson 所做的事情稍作修改时,这似乎比编写自定义 deserializer 更容易。/serializer全类。 Jackson 还有一个 JsonAnySetter用于类中未指定内容的后备注解(我发现这有时很方便;我已经使用它将某种元素的所有 XML 属性放入单个 Map 中,而不必具有属性对于每个可能的属性)。
您可以将自定义 XML 反序列化方法添加到您的 Root 类。像这样的东西:

@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]]

关于java - 使用多个 useWrapping = false 时,Jackson XML 反序列化会跳过字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63220292/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com