2017-09-03 66 views
0

在我的Spring Boot应用程序中,当我写一个类时,我想在序列化时排除该类的对象中的null值,我只需使用@JsonInclude(Include.NON_NULL)注释该类,或者在属性文件中指定属性spring.jackson.serialization-inclusion=NON_NULLSpring Boot Jackson:如何从java数组中删除空值?

但现在我有一个控制器,它返回我的类的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) { 

这不会给任何错误,但没有按”不管工作。

试着设置属性文件中的属性,没有工作。

检索了用于Jackson序列化功能的github documentation,但没有发现任何能够在序列化时省略来自Java数组的null值。最接近的功能是write_empty_json_arrays,但那不是我所需要的。

是否java数组需要是固定长度的事实必须做这件事?

我应该怎么做才能将一个java数组:[object1, object2, null]大小为3到[{}, {}]而不是[{}, {}, null]

+1

只是做了正确的事情滤除null vaues,并停止返回部分填充阵列。根本不要甚至返回数组。返回列表(或集合)。正确做事有助于。您不应该试图调整Jackson来弥补代码中的设计问题。您应该修复设计问题。 –

+1

不确定关于杰克逊,但您可以使用java 8流来过滤其中值!= null的数组,然后将流收集回数组 –

+0

@JBNizet为什么这不是正确的事情?我的要求是返回前20的评论。我返回了20条评论。如果没有足够的评论,则null存在于数组中。我可以使用'List '做到这一点,但在此之前,我很好奇,为什么这不是正确的事情。你能提供一些见解吗? –

回答

1

您绝对应该更改业务逻辑,不要返回具有null值的数组。或者,你可以使用Java 8的流产生的阵列,例如:

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