我们正在使用JaxRS&杰克逊将数据发送给我们的客户。由于客户端是Javascript,如果没有该属性的有效值(默认情况下JaxRS默认),我们实际上不需要发送空值或空数组。有办法解决这个问题吗?
一个例子。 JaxRS发送此信息:
{"prop1":[],"prop2":null,"prop3":"foo"}
我们可能已经离开了
{"prop3":"foo"}
答案 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?。