在使用Jackson序列化XML时如何指定列表元素名称?

时间:2018-01-25 23:42:37

标签: java xml jackson

考虑以下JUnit测试片段,该片段练习将包含多个列表的对象序列化为XML。

static class MyItem {
    @JsonProperty("MyField")
    int myField;
}

static class MyLists {
    @JacksonXmlElementWrapper(localName = "SomeItems")
    @JacksonXmlProperty(localName = "MyItem")
    List<MyItem> someItems;

    @JacksonXmlElementWrapper(localName = "OtherItems")
    @JacksonXmlProperty(localName = "MyItem")
    List<MyItem> otherItems;
}

@Test
public void TestMultipleListSerialization() throws Exception {
    MyItem item1 = new MyItem();
    item1.myField = 42;

    MyItem item2 = new MyItem();
    item2.myField = 123;

    List<MyItem> someItems = Arrays.asList(item1, item2);

    MyItem item3 = new MyItem();
    item3.myField = 321;

    List<MyItem> otherItems = Collections.singletonList(item3);

    MyLists myLists = new MyLists();
    myLists.someItems = someItems;
    myLists.otherItems = otherItems;

    ObjectMapper serializer = new XmlMapper();
    String serialized = serializer.writeValueAsString(myLists);
}

当我运行此测试时,我得到例外:com.fasterxml.jackson.databind.JsonMappingException: Multiple fields representing property "MyItem"。但是,如果我在其中一个JacksonXmlProperty注释中使用不同的localName,则列表元素的名称是错误的。例如,如果我将其中一个本地名称更改为&#34; MyItemB&#34;,它将生成以下XML:

<MyLists>
    <SomeItems>
        <MyItem>
            <MyField>42</MyField>
        </MyItem>
        <MyItem>
            <MyField>123</MyField>
        </MyItem>
    </SomeItems>
    <OtherItems>
        <MyItemB>
            <MyField>321</MyField>
        </MyItemB>
    </OtherItems>
</MyLists>

我应该使用哪些注释来指定列表元素名称?

1 个答案:

答案 0 :(得分:0)

这是杰克逊自2012年以来的一个已知问题。它可能会在一段时间内继续存在问题。当一个对象包含多个具有相同元素名称的列表时,解决方法是将每个列表放在一个仅包含该列表的包装类中。

https://github.com/FasterXML/jackson-dataformat-xml/issues/192

相关问题