有没有办法使用Jackson将以下xml反序列化为Map hold of items?
<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);
并获得以下地图。列表中的第一项缺失。
{
order={
number=12345678,
amount=100.1,
items={
item={
amount=200.0,
itemName=ItemName2,
itemId=234
}
}
}
}
答案 0 :(得分:0)
通过扩展UntypedObjectDeserializer来创建一个自定义反序列化器来完成这项工作。
答案 1 :(得分:0)
如果必须使用readTree()
和JsonNode
,其他答案将不起作用。我知道这是一个丑陋的解决方案,但至少您不需要在项目中粘贴某人的要点。
将org.json添加到您的项目依赖项中。
然后执行以下操作:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.json.JSONObject;
import org.json.XML;
...
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
...
JSONObject soapDatainJsonObject = XML.toJSONObject(data);
return OBJECT_MAPPER.readTree(soapDatainJsonObject.toString());
转换如下:
XML-> JSONObject(使用org.json)->字符串-> JsonNode(使用readTree)
当然,toJSONObject可以毫无问题地处理重复项,我建议避免使用Jackson和readTree()
。