How to serialize a list of POJO using FasterXML library

痞子三分冷 提交于 2020-01-17 11:12:05

问题


I'm using FasterXML to serialize POJO. I want to serialize a list of my POJO. When serialize a signle POJO I get the expected xml (there's one problem --> question 2) Here's my code:

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);

I get this:

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

Here's what I want:

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

or

<movie imdbID="tt0077687" title="The Hobbit" year="1977"/>
<movie imdbID="tt0077687" title="title2" year="1977"/>
  1. When I serialize a movie I get this:

Is it possible to get this:

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

回答1:


As a general rule, do not try serializing List, Maps or arrays directly as the root-level value: always use a Bean (POJO). Properties may be of any types, recursively.

The problem is that Java type erasure make things problematic for collection and Map types in general (even with JSON); but there are additional problems for XML.

So while it may seem unnecessary, I have found it safest to have a simple Object as the root value, even if it's only something like:

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

Having said that, to change the name of root element can be done multiple ways. One possibility is to use Jackson annotation @JsonRootName (despite "Json" in there, it applies to all formats).

Or, you can use ObjectWriter, override root name with:

String xml mapper.writer().withRootName("movies").writeValueAsString(movies);



回答2:


You'll probably have to annotate your movies variable. (And likely either pull it out into a field or declare an object to encapsulate it.) Check the annotations on this page to see if something matches. Sorry I can't be more specific.

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



来源:https://stackoverflow.com/questions/29288408/how-to-serialize-a-list-of-pojo-using-fasterxml-library

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!