2

假设我的 XML 是:

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

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

例如,如果我使用 a 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}}

是否有任何类型杰克逊理解并且可以正确处理数组?

4

1 回答 1

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();
    }
}
于 2016-01-31T18:44:55.527 回答