优化杰克逊/杰克逊排除空值,空列表,阵列
我们正在使用杰克逊向我们的客户发送数据的杰克逊&。由于客户端是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);
首先从您的JSON所有下探性质的侥幸可能会导致错误或在客户端代码不清 - 的客户端必须在使用它之前检查给定的属性是否存在,如果属性丢失,则会报告JavaScript错误。无聊的东西。
由于HTTP通信是gzipped,删除属性的潜在收益似乎并不显着(我可能是错的,显然 - 我不知道你的应用程序)。 GET请求可以被有效地缓存,所以还有一个理由来避免这种优化。
您可以根据需要自定义Java对象的序列化为JSON。请参阅此问题How can I customize serialization of a list of JAXB objects to JSON?以获得进一步解释如何执行此操作。
感谢。我对我的意图有点不诚实。实际上,我在开发客户端时开始使用非常干净的静态JSON,但由于该文件中的大多数属性都是可选的且很少使用,因此服务器生成的版本非常大而且很难看。你可能是对的,这不是一个真正的性能问题,但是阅读起来比阅读困难得多。感谢您的链接。 – 2012-04-27 02:49:49
请注意,这些方法仅适用于杰克逊,而不适用于使用JAX-RS的供应商。 – Zero3 2015-06-30 14:18:45
是的。据我所知,JAX-RS几乎没有标准化的配置设置,并且没有值类注释。 – StaxMan 2015-07-08 03:50:07