我试图弄清楚如何使用List
(XmlMapper
的子类)将专用的ObjectMapper
序列化为XML,同时控制每个元素的外包装的名称。 / p>
最好,我想通过注释来实现此目的,而不是通过调整XmlMapper
(我可能无法访问它)来实现。
例如,考虑扩展ArrayList
的业务对象,如下所示:
static class Photo {
String name;
}
class Album extends ArrayList<Photo> {
}
我想将此模型序列化为JSON和XML,如下所示:
JSON:
[
{
"name": "..."
},
{
"name": "..."
}
]
XML:
<Album>
<Photo>
<Name>...</Name>
</Photo>
<Photo>
<Name>...</Name>
</Photo>
<Album>
我真的很想知道如何做到这一点,并且我已经成功构建了上述模型的版本以支持这两种格式,但是我无法获得同时支持这两种格式的任何版本。
如果不清楚我要问的是什么,请考虑以下通过单元测试(这是我的问题的简化表示),然后参考TODO:
public class SpecializedListTest {
@JsonRootName("Photo")
class Photo {
@JsonProperty("name")
String name;
}
@JsonRootName("Album")
class Album1 extends ArrayList<Photo> {}
Album1 getAlbum1() {
Album1 album = new Album1();
Photo photo = new Photo();
photo.name = "Hawaii";
album.add(photo);
album.add(photo);
return album;
}
@Test
public void serializeAlbum1ToJson() throws JsonProcessingException {
Album1 album = getAlbum1();
ObjectMapper mapper = new ObjectMapper();
String actual = mapper.writeValueAsString(album);
String expected = "[{'name':'Hawaii'},{'name':'Hawaii'}]".replace('\'', '"');
assertEquals(expected, actual);
}
@Test
public void serializeAlbum1ToXml() throws JsonProcessingException {
Album1 album = getAlbum1();
ObjectMapper mapper = new XmlMapper();
String actual = mapper.writeValueAsString(album);
// TODO Render as "<Photo>" instead of "<item">.
String expected = "<Album><item><name>Hawaii</name></item><item><name>Hawaii</name></item></Album>";
assertEquals(expected, actual);
}
@JsonRootName("Album")
class Album2 {
@JsonProperty
@JacksonXmlElementWrapper(useWrapping = false)
@JacksonXmlProperty(localName = "Photo")
private final List<Photo> photos = new ArrayList<>();
}
Album2 getAlbum2() {
Album2 album = new Album2();
Photo photo = new Photo();
photo.name = "Hawaii";
album.photos.add(photo);
album.photos.add(photo);
return album;
}
@Test
public void serializeAlbum2ToJson() throws JsonProcessingException {
Album2 album = getAlbum2();
ObjectMapper mapper = new ObjectMapper();
String actual = mapper.writeValueAsString(album);
// TODO Render as list, not object: [{"name":"Hawaii"},{"name":"Hawaii"}]
String expected = "{'photos':[{'name':'Hawaii'},{'name':'Hawaii'}]}".replace('\'', '"');
assertEquals(expected, actual);
}
@Test
public void serializeAlbum2ToXml() throws JsonProcessingException {
Album2 album = getAlbum2();
ObjectMapper mapper = new XmlMapper();
String actual = mapper.writeValueAsString(album);
String expected = "<Album><Photo><name>Hawaii</name></Photo><Photo><name>Hawaii</name></Photo></Album>";
assertEquals(expected, actual);
}
}
基于列表的模型(Album1
)的问题在于,我似乎无法控制Photo
的外部XML元素的名称。默认为<item>
。
列表容器模型(Album2
)的问题在于,列表以对象的属性形式显示,我希望输出为JSON数组,而不是对象。
我不能满足于不同的输出格式,因为我正在为现有的旧产品编写兼容的替代品。我知道我可以使用自定义序列化程序解决此问题,但我希望避免这种情况。
有什么想法吗?