【问题标题】:How to serialize a list of POJO using FasterXML library如何使用 FasterXML 库序列化 POJO 列表
【发布时间】:2015-03-26 20:39:56
【问题描述】:

我正在使用 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>

【问题讨论】:

    标签: java xml jackson fasterxml


    【解决方案1】:

    作为一般规则,不要尝试将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);
    

    【讨论】:

    • 好的,谢谢。我的第二个问题你有什么想法吗?
    • 如果您的意思是空 XML 标记与开始/结束元素,这可以通过配置底层 XML 库(至少如果您使用 Woodstox)来实现。如果您的意思是更改项目元素的名称,那就更棘手了。
    • 我只是使用 Woodstox 的 FasterXML,但我不知道如何配置它。我刚刚在我的 pom 中添加了woodstox 依赖项。
    • 明白。我的意思是您可以使用特定的XMLInputFactory 和/或XMLOutputFactory 实例(这些是Stax API 抽象,由Woodstox 及其WstxInputFactoryWstxOutputFactory 实现)构造XmlMapper 来使用。您可以预先配置具有不同属性的工厂。但是由于我不记得什么输出设置可以强制写出空元素,我想这是没有实际意义的。 :)
    【解决方案2】:

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

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

    【讨论】:

    • 我不是电影资产。我有一个电影课
    猜你喜欢
    • 1970-01-01
    • 2014-07-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2016-03-21
    • 2013-09-16
    相关资源
    最近更新 更多