考虑以下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>
我应该使用哪些注释来指定列表元素名称?
答案 0 :(得分:0)
这是杰克逊自2012年以来的一个已知问题。它可能会在一段时间内继续存在问题。当一个对象包含多个具有相同元素名称的列表时,解决方法是将每个列表放在一个仅包含该列表的包装类中。
https://github.com/FasterXML/jackson-dataformat-xml/issues/192