0

我正在使用 FasterXML 序列化 POJO。我想序列化我的 POJO 列表。当序列化一个signle POJO时,我得到了预期的xml(有一个问题->问题2)这是我的代码:

List<Movie> movies = new ArrayList<>();
// add movies
JacksonXmlModule module = new JacksonXmlModule();
module.setDefaultUseWrapper(false);
xmlMapper = new XmlMapper(module);
xmlMapper.disable(MapperFeature.AUTO_DETECT_CREATORS,
            MapperFeature.AUTO_DETECT_FIELDS,
            MapperFeature.AUTO_DETECT_GETTERS,
            MapperFeature.AUTO_DETECT_IS_GETTERS,
            MapperFeature.AUTO_DETECT_SETTERS,
            MapperFeature.USE_GETTERS_AS_SETTERS);
String xml = xmlMapper.writeValueAsString(movies);

我明白了:

<ArrayList>
    <item imdbID="tt0077687" title="The Hobbit" year="1977"/>
</ArrayList>

这就是我想要的:

<movies>
    <movie imdbID="tt0077687" title="The Hobbit" year="1977"/>
    <movie imdbID="tt0077687" title="title2" year="1977"/>
</movies>

或者

<movie imdbID="tt0077687" title="The Hobbit" year="1977"/>
<movie imdbID="tt0077687" title="title2" year="1977"/>
  1. 当我连载一部电影时,我得到了这个:

是否有可能得到这个:

<movie imdbID="tt0077687" title="The Hobbit" year="1977"><movie>
4

2 回答 2

2

作为一般规则,不要尝试将ListMaps 或数组直接序列化为根级值:始终使用 Bean (POJO)。属性可以是任何类型的,递归的。

问题是 Java 类型擦除通常会给集合和 Map 类型带来问题(即使是 JSON);但是 XML 还有其他问题。

因此,虽然看起来没有必要,但我发现将一个简单的 Object 作为根值是最安全的,即使它只是这样的:

public class Response {
   public List<Movie> movies;
}

话虽如此,更改根元素的名称可以通过多种方式完成。一种可能性是使用 Jackson 注释@JsonRootName(尽管其中有“Json”,但它适用于所有格式)。

或者,您可以使用ObjectWriter, 覆盖根名称:

String xml mapper.writer().withRootName("movies").writeValueAsString(movies);
于 2015-03-26T21:02:11.660 回答
0

您可能必须注释您的movies变量。(并且可能将其拉出到一个字段中或声明一个对象来封装它。)检查此页面上的注释以查看是否匹配。对不起,我不能更具体。

https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations

于 2015-03-26T20:51:35.470 回答