【问题标题】:Serialize empty List by ignoring null element/property in fasterXml Jackson java通过忽略fastXml Jackson java中的空元素/属性来序列化空列表
【发布时间】:2018-05-06 13:19:34
【问题描述】:

当我尝试序列化一个类时,Jackson 将空列表作为带有一个空元素的列表。

....
@JacksonXmlElementWrapper(localName = "users")
@JacksonXmlProperty(localName = "user")
private List<User> users;
....

Xml 输出:

<response>
   <users>
        <user/>
   </users>
</response>

Json 输出:

{
    "users": null
}

但我认为,我应该得到如下的空列表(用户内部没有空的用户元素):

<response>
   <users/>
</response>

如何解决这个问题?

【问题讨论】:

  • 你有没有在某处初始化List&lt;Users&gt; users
  • @ShanuGupta No.
  • 你应该在某个地方初始化它(在构造函数中?)。
  • @ShanuGupta 我不能。它的 JPA 实体对象和它的 OneToMany 映射,所以默认情况下惰性只获取它的 NULL

标签: java json xml jackson fasterxml


【解决方案1】:

只需从 getUsers() 返回空列表即可获得所需的结果。

@JacksonXmlRootElement(localName = "response")
public class Response {

    @JacksonXmlElementWrapper(localName = "users")
    @JacksonXmlProperty(localName = "user")
    private List<User> users;

    public List<User> getUsers() {

        if(null == users) {
            return Collections.emptyList();
        }
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }
}

主要方法

ObjectMapper mapper = new XmlMapper();
Response response = new Response();
String s = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(response);
System.out.println(s);

response.setUsers(Arrays.asList(new User("1", "Hemant")));
s = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(response);
System.out.println(s);

输出

<response>
  <users/>
</response>

<response>
  <users>
    <user>
      <id>1</id>
      <name>Hemant</name>
    </user>
  </users>
</response>

还有一件事,当getUsers()不变时

public List<User> getUsers() {  
    /*if(null == users) {
        return Collections.emptyList();
    }*/
    return users;
}

输出是

<response/>

【讨论】:

  • 使用普通的 java 类,它工作正常,但映射不起作用,即 OneToMany(mappedBy = "query")
【解决方案2】:

如果您对 Hibernate/DBJackson/XML 使用相同的模型,则需要加载适当的 Hibernate 模块以正确序列化持久化集合。如需更多信息,请参阅jackson-datatype-hibernate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 2016-05-17
    • 2013-12-06
    • 2016-03-05
    • 1970-01-01
    • 2016-11-21
    • 2021-12-17
    • 2015-01-12
    相关资源
    最近更新 更多