java jackson自定义反序列化程序仅获取列表xml中的最后一个值
我有以下xml
<root>
<date>112004</date>
<entries>
<entry id = 1>
<status>Active</status>
<person>
<Name>John</Name>
<Age>22</Age>
</person>
</entry>
<entry id = 2>
<status>Active</status>
<person>
<Name>Doe</Name>
<Age>32</Age>
</person>
</entry>
<entry id = 3>
<status>N/A</status>
</entry>
</entries>
我正在使用定制的jackson反序列化程序来获取值,pojo看起来像
@JacksonXmlRootElement(localName="root", namespace="namespace")
类根 { 私人字符串日期
@JacksonXmlProperty(localName = "entries", namespace="tns")
private List<Entry> entries;
//getter and setter
}
class Entry {
private String id;
private String status;
private Person person;
//getter and setter
}
反序列化程序代码如下所示
public class DeSerializer extends StdDeserializer<root>
{
protected DeSerializer() {
super(root.class);
}
@Override
public root deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonNode nodes = p.readValueAsTree();
ObjectMapper mapper = new ObjectMapper();
List<Entry> entry = mapper.convertValue(nodes.findValues("entry"), new TypeReference<List<Entry>>() {});
}
}
main()
{
XmlMapper x = new XmlMapper();
final SimpleModule module = new SimpleModule("configModule", com.fasterxml.jackson.core.Version.unknownVersion());
module.addDeserializer(root.class, new DeSerializer());
x.registerModule(module);
root r = x.readValue(xmlSource, root.class); /*xmlsource is xml as string*/
}
问题是,当我调试时,我总是从xml中获取最后一个值。所以节点(在反序列化程序中)的值是{“日期”:“112004”,“条目”:{“条目”:{“id”:“3”,“状态”:“N/A”}}},我不确定为什么它不被视为列表。我确实为列表添加了unwrapped=false的注释,但没有成功
# 1 楼答案
似乎
readValueAsTree
不支持获取整个集合我在没有定制的情况下做了一些变通
DeSerializer
,这很有效然后进行单元测试:
# 2 楼答案
如果仍有人面临此问题,请升级至最新的jackson 2.12.3版本。 我在2.11中遇到了这个问题。x版