是否有方法使用Jackson将以下xml反序列化为保存项列表的Map?
<order>
<number>12345678</number>
<amount>100.10</amount>
<items>
<item>
<itemId>123</itemId>
<amount>100.0</amount>
<itemName>Item Name1</itemName>
</item>
<item>
<itemId>234</itemId>
<amount>200.00</amount>
<itemName>Item Name1</itemName>
</item>
</items>
</order>
我试过了
XmlMapper mapper = new XmlMapper();
LinkedHashMap map = (LinkedHashMap)mapper.readValue(xml, Object.class);
并获得了以下Map。列表中的第一项丢失。
{
order={
number=12345678,
amount=100.1,
items={
item={
amount=200.0,
itemName=ItemName2,
itemId=234
}
}
}
}
4条答案
按热度按时间iezvtpos1#
这是一个已知的
jackson-dataformat-xml
错误,在issue 205下归档。简单地说,XML中的重复元素被当前的UntypedObjectDeserializer
实现所吞噬。幸运的是,该报告的作者(João Paulo Varandas)也提供了a temporary fix in the form a customUntypedObjectDeserializer
implementation。下面我分享我对修复的解释:6jjcrrmo2#
如果你必须使用
readTree()
和JsonNode
,其他的答案就不起作用了。我知道这是一个丑陋的解决方案,但至少你不需要在你的项目中粘贴某人的要点。将org.json添加到项目依赖关系中。
然后执行以下操作:
转换过程如下:
XML -〉JSON对象(使用org.json)-〉字符串-〉JSON节点(使用readTree)
当然,toJSONObject处理重复没有任何问题,我建议如果可以的话尽量避免使用Jackson和
readTree()
。vhmi4jdf3#
通过扩展UntypedObjectDeserializer创建了一个自定义反序列化程序来执行此工作。
bsxbgnwa4#
如果您没有绑定到Jackson,underscore-java可以很好地完成此操作: