优化JaxRS / Jackson以排除空值,空列表,数组

时间:2012-04-25 15:03:34

标签: json jackson jax-rs

我们正在使用JaxRS&杰克逊将数据发送给我们的客户。由于客户端是Javascript,如果没有该属性的有效值(默认情况下JaxRS默认),我们实际上不需要发送空值或空数组。有办法解决这个问题吗?

一个例子。 JaxRS发送此信息:

{"prop1":[],"prop2":null,"prop3":"foo"}

我们可能已经离开了

{"prop3":"foo"}

2 个答案:

答案 0 :(得分:7)

有多种方法可以实现这一目标,具体取决于:注释@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)是一种方式。或者,因为您还想删除空列表,数组,所以将NON_NULL更改为NON_EMPTY。

也可以将其配置为默认行为;在杰克逊1.9:

mapper.setSerializationConfig(mapper.getSerializationConfig().withSerializationInclusion(
  JsonSerialize.Inclusion.NON_EMPTY));

并且在Jackson 2.0中,更简单:

mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_EMPTY);

答案 1 :(得分:2)

首先从JSON中删除属性可能导致客户端错误或代码不清楚 - 客户端必须在使用之前检查给定属性是否存在,如果缺少该属性,则会报告JavaScript错误。无聊的东西。

由于HTTP通信是gzip压缩,删除属性的潜在收益似乎并不重要(我可能错了,显然 - 我不知道你的应用程序)。 GET请求可以被有效地缓存,这是避免这种优化的另一个原因。

您可以根据需要自定义Java对象的序列化为JSON。有关如何执行此操作的详细说明,请参阅此问题How can I customize serialization of a list of JAXB objects to JSON?