Json 优化JaxRS/Jackson以排除空值、空列表和数组

Json 优化JaxRS/Jackson以排除空值、空列表和数组,json,jackson,jax-rs,Json,Jackson,Jax Rs,我们正在使用JaxRS和Jackson向我们的客户发送数据。由于客户机是Javascript,因此如果没有该属性的有效值(JaxRS默认情况下会这样做),我们实际上不需要发送空值或空数组。有办法解决这个问题吗 举个例子。JaxRS发送了以下消息: {“prop1”:[],“prop2”:null,“prop3”:“foo”} 我们本可以逃脱惩罚的地方 {“prop3”:“foo”} 首先,从JSON中删除属性可能会导致客户端出现错误或代码不清晰-客户端在使用之前必须检查给定属性是否存在,如

我们正在使用JaxRS和Jackson向我们的客户发送数据。由于客户机是Javascript,因此如果没有该属性的有效值(JaxRS默认情况下会这样做),我们实际上不需要发送空值或空数组。有办法解决这个问题吗

举个例子。JaxRS发送了以下消息:


{“prop1”:[],“prop2”:null,“prop3”:“foo”}

我们本可以逃脱惩罚的地方


{“prop3”:“foo”}

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

由于HTTP通信是gzip的,删除属性的潜在收益似乎并不显著(很明显,我可能错了——我不知道您的应用程序)。GET请求可以有效地缓存,所以避免这种优化还有一个原因


您可以根据需要将Java对象序列化为JSON。请参阅此问题以进一步了解如何做到这一点。

有多种方法可以实现这一点,具体取决于;注释
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
是一种方法。或者,由于您还希望删除空列表、数组,请将NON_NULL更改为NON_empty

也可以将其配置为默认行为;在Jackson 1.9中:

mapper.setSerializationConfig(mapper.getSerializationConfig().withSerializationInclusion(
  JsonSerialize.Inclusion.NON_EMPTY));
在Jackson 2.0中,更简单一些:

mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_EMPTY);

谢谢我对自己的意图不太诚实。老实说,在开发客户机时,我开始使用非常干净的静态JSON,但由于文件中的大多数属性都是可选的,很少使用,因此服务器生成的版本非常大,而且很难看。您可能是对的,这不是一个真正的性能问题,但它比可能的更难阅读。感谢您的链接。请注意,这些方法仅适用于Jackson,而不是使用JAX-RS的独立于供应商的方法。是的。据我所知,JAX-RS的标准化配置设置很少,也没有值类注释。在@JsonSerialize中指定“include”现在已被弃用,应该改用@JsonInclude(JsonInclude.include.NON_NULL)