我们正在使用 JaxRS & Jackson 向我们的客户发送数据。由于客户端是 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));
在 Jackson 2.0 中,更简单一些:
mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_EMPTY);
首先,从 JSON 中删除属性可能会导致客户端出现错误或代码不清晰 - 客户端必须在使用给定属性之前检查它是否存在,如果该属性丢失,则会报告 JavaScript 错误。无聊的东西。
由于 HTTP 通信是 gzip 压缩的,因此删除属性的潜在收益似乎并不显着(显然我可能是错的 - 我不知道您的应用程序)。GET 请求可以被有效地缓存,因此还有一个理由避免这种优化。
您可以根据需要自定义将 Java 对象序列化为 JSON。请参阅此问题如何将 JAXB 对象列表的序列化自定义为 JSON?进一步解释如何做到这一点。