Spring Boot Jackson:如何从java数组中删除空值?

时间:2017-09-03 08:25:33

标签: java arrays spring-boot serialization jackson

在我的Spring Boot应用程序中,当我编写一个类并且我希望在序列化时从该类的对象中排除null值时,我只是用@JsonInclude(Include.NON_NULL)注释该类,或者我分配我的属性文件中的属性spring.jackson.serialization-inclusion=NON_NULL

但是现在我有一个控制器返回我的类的Java数组(不是Collection):

@RequestMapping(path = "/reviews", method = GET, produces = APPLICATION_JSON_VALUE)
public Review[] searchReviews(@RequestParam Map<String, String> params) {

很多时候这个数组都不满,在这种情况下我得到null表示没有项目的位置。

如何在序列化时告诉Jackson省略Java数组中存在的空值?

我只是把注释放在我的控制器方法之上,如下所示:

@JsonInclude(JsonInclude.Include.NON_NULL)
@RequestMapping(path = "/reviews", method = GET, produces = APPLICATION_JSON_VALUE)
public Review[] searchReviews(@RequestParam Map<String, String> params) {

和此:

@RequestMapping(path = "/reviews", method = GET, produces = APPLICATION_JSON_VALUE)
public @JsonInclude(JsonInclude.Include.NON_NULL) Review[] searchReviews(@RequestParam Map<String, String> params) {

这不会产生任何错误,但也不起作用。

尝试在属性文件中设置属性,但无效。

搜索了github documentation的Jackson序列化功能,但没有发现任何能够在序列化时从Java数组中省略null值的内容。最接近的功能是write_empty_json_arrays,但这不是我需要的。

java数组需要具有固定长度这一事实是否必须对此做些什么?

如何将大小为3的[object1, object2, null]转换为[{}, {}]而不是[{}, {}, null]

1 个答案:

答案 0 :(得分:1)

您绝对应该更改业务逻辑,而不是返回具有null值的数组。或者,您可以使用Java 8的流过滤掉结果数组中的null个vaues,例如:

Review[] reviews = //result;
return Arrays.stream(reviews)
   .filter(r -> r != null)
   .toArray(Review[]::new);