Jackson XML - 是否有可用于反序列化包含数组的对象的Java内置类型?

时间:2016-01-31 16:49:10

标签: java jackson jackson-dataformat-xml

让我们说我的XML是:

<someObject>
  <someArray>
    <element>111</element>
    <element>222</element>
  </someArray>
</someObject>

我是否可以使用Java内置类型来反序列化此XML而无需自定义反序列化代码?

例如,如果我使用Map<Object, Object>,则只保留一个element,另一个被覆盖! :

String xmlStr = "<someObject><someArray><element>111</element><element>222</element></someArray></someObject>";
Map<Object, Object> resultObj = getXmlMapper().readValue(xmlStr, new TypeReference<Map<Object, Object>>(){});
System.out.println(resultObj);

打印:

{someArray={element=222}}

杰克逊能理解并且可以正确处理数组吗?

1 个答案:

答案 0 :(得分:1)

在您的具体情况下,您可以使用

new TypeReference<Map<Object, List>> 

输出:{someArray = [111,222]}。

如果您的XML更复杂,我更倾向于使用适当的结构。

@JacksonXmlRootElement(localName = "someObject")
public static class SomeObject {
    @JacksonXmlProperty(localName = "someArray")
    List<String> someArray; 

    @Override
    // for testing
    public String toString() {
        return someArray.toString();
    }
}

public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
    ObjectMapper map = new XmlMapper();
    String xmlStr = "<someObject><someArray><element>111</element><element>222</element></someArray></someObject>";
    SomeObject resultObj = map.readValue(xmlStr, new TypeReference<SomeObject>(){});
    System.out.println(resultObj);      
}

<强>输出

[111,222]

或者使用数组

@JacksonXmlRootElement(localName = "someObject")
public static class SomeObject {
    @JacksonXmlProperty(localName = "someArray")
    String[] someArray; 

    @Override
    public String toString() {
        return Arrays.asList(someArray).toString();
    }
}