杰克逊:使用列表反序列化来映射XML

时间:2012-12-19 21:49:42

标签: xml serialization jackson

有没有办法使用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
            }
        }
    }
}

2 个答案:

答案 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()