XmlMapper:如何在控制元素名称的同时将列表序列化为XML

时间:2019-03-13 18:59:10

标签: java list xmlmapper

我试图弄清楚如何使用ListXmlMapper的子类)将专用的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数组,而不是对象。

我不能满足于不同的输出格式,因为我正在为现有的旧产品编写兼容的替代品。我知道我可以使用自定义序列化程序解决此问题,但我希望避免这种情况。

有什么想法吗?

0 个答案:

没有答案