优化杰克逊/杰克逊排除空值,空列表,阵列

问题描述:

我们正在使用杰克逊向我们的客户发送数据的杰克逊&。由于客户端是Javascript,如果没有该属性的有效值(JaxRS默认情况下),我们并不需要发送空值或空数组。有没有解决的办法?优化杰克逊/杰克逊排除空值,空列表,阵列

一个例子。 JAXRS发送此:

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

在那里我们可以有

{"prop3":"foo"}

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

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

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

,并在杰克逊2.0,简单一点:

mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_EMPTY); 
+0

请注意,这些方法仅适用于杰克逊,而不适用于使用JAX-RS的供应商。 – Zero3 2015-06-30 14:18:45

+0

是的。据我所知,JAX-RS几乎没有标准化的配置设置,并且没有值类注释。 – StaxMan 2015-07-08 03:50:07

首先从您的JSON所有下探性质的侥幸可能会导致错误或在客户端代码不清 - 的客户端必须在使用它之前检查给定的属性是否存在,如果属性丢失,则会报告JavaScript错误。无聊的东西。

由于HTTP通信是gzipped,删除属性的潜在收益似乎并不显着(我可能是错的,显然 - 我不知道你的应用程序)。 GET请求可以被有效地缓存,所以还有一个理由来避免这种优化。

您可以根据需要自定义Java对象的序列化为JSON。请参阅此问题How can I customize serialization of a list of JAXB objects to JSON?以获得进一步解释如何执行此操作。

+1

感谢。我对我的意图有点不诚实。实际上,我在开发客户端时开始使用非常干净的静态JSON,但由于该文件中的大多数属性都是可选的且很少使用,因此服务器生成的版本非常大而且很难看。你可能是对的,这不是一个真正的性能问题,但是阅读起来比阅读困难得多。感谢您的链接。 – 2012-04-27 02:49:49