如何使用 FasterXML 库序列化 POJO 列表
How to serialize a list of POJO using FasterXML library
我正在使用 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"/>
当我连载一部电影时,我得到这个:
是否可以得到这个:
<movie imdbID="tt0077687" title="The Hobbit" year="1977"><movie>
您可能需要注释 movies
变量。 (并且可能将其拉出到一个字段中或声明一个对象来封装它。)检查此页面上的注释以查看是否匹配。对不起,我不能更具体。
https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations
作为一般规则,不要尝试将 List
、Map
或数组直接序列化为根级值:始终使用 Bean (POJO)。递归地,属性可以是任何类型。
问题是 Java 类型擦除通常会使集合和 Map 类型出现问题(即使 JSON);但是 XML.
还有其他问题
所以虽然看起来没有必要,但我发现将一个简单的对象作为根值是最安全的,即使它只是像这样的东西:
public class Response {
public List<Movie> movies;
}
话虽如此,可以通过多种方式更改根元素的名称。一种可能是使用 Jackson 注释 @JsonRootName
(尽管其中有 "Json",但它适用于所有格式)。
或者,您可以使用 ObjectWriter
,将根名称覆盖为:
String xml mapper.writer().withRootName("movies").writeValueAsString(movies);
我正在使用 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"/>
当我连载一部电影时,我得到这个:
是否可以得到这个:
<movie imdbID="tt0077687" title="The Hobbit" year="1977"><movie>
您可能需要注释 movies
变量。 (并且可能将其拉出到一个字段中或声明一个对象来封装它。)检查此页面上的注释以查看是否匹配。对不起,我不能更具体。
https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations
作为一般规则,不要尝试将 List
、Map
或数组直接序列化为根级值:始终使用 Bean (POJO)。递归地,属性可以是任何类型。
问题是 Java 类型擦除通常会使集合和 Map 类型出现问题(即使 JSON);但是 XML.
还有其他问题所以虽然看起来没有必要,但我发现将一个简单的对象作为根值是最安全的,即使它只是像这样的东西:
public class Response {
public List<Movie> movies;
}
话虽如此,可以通过多种方式更改根元素的名称。一种可能是使用 Jackson 注释 @JsonRootName
(尽管其中有 "Json",但它适用于所有格式)。
或者,您可以使用 ObjectWriter
,将根名称覆盖为:
String xml mapper.writer().withRootName("movies").writeValueAsString(movies);