SpringBootJackson:如何从java数组中删除空值?

SpringBootJackson:如何从java数组中删除空值?,java,arrays,spring-boot,serialization,jackson,Java,Arrays,Spring Boot,Serialization,Jackson,在我的Spring Boot应用程序中,当我编写一个类,并且我想在序列化时从该类的对象中排除null值时,我只是用@JsonInclude(Include.NON_null)注释该类或者,我在属性文件中指定属性spring.jackson.serialization include=NON_NULL 但现在我有了一个控制器,它返回类的Java数组(不是集合),如下所示: @RequestMapping(path = "/reviews", method = GET, produces = APP

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

但现在我有了一个控制器,它返回类的Java数组(不是
集合
),如下所示:

@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) {
@RequestMapping(path=“/reviews”,method=GET,products=APPLICATION\u JSON\u VALUE)
public@JsonInclude(JsonInclude.Include.NON_NULL)Review[]searchReviews(@RequestParam-Map-params){
这不会给出任何错误,但也不起作用

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

搜索了Jackson序列化功能,但未找到任何允许在序列化时从Java数组中忽略
null
值的功能。最近的功能是
write\u empty\u json\u array
,但这不是我需要的

java数组需要固定长度这一事实是否与此有关


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

您肯定应该更改业务逻辑,以不返回带有
null
值的数组。或者,您可以使用Java 8的流从结果数组中筛选出
null
值,例如:

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

只要做正确的事情,停止返回部分填充的数组。甚至根本不返回数组。返回列表(或集合)。正确操作会有所帮助。您不应该试图调整Jackson以补偿代码中的设计问题。您应该修复设计问题。不确定Jackson,但您可以使用java 8 streams筛选值!=null的数组,然后将流收集回array@JBNizet为什么这不是一件正确的事?我的要求t是返回前20条评论。我返回包含20条评论的数组。如果没有足够的评论,数组中会出现null。我可以使用
列表
执行此操作,但在执行此操作之前,我很好奇为什么这不是一件正确的事。你能给出一些见解吗?因为当API返回评论数组时,客户端希望返回array包含评论。不是一个数组,其中一半元素是评论,另一半为null,因此客户端必须计算非null元素的数量,以了解它实际包含多少评论(而不是仅使用list.size(),并且必须到处添加空检查以避免NPE,如果API首先返回一个非空检查列表,那么就不需要NPE。如果你去商店买鸡蛋,并且必须打开每个鸡蛋盒以检查它是否实际包含预期的6个鸡蛋,而不是2个、4个或5个鸡蛋,你会高兴吗?不,商店做的是正确的,并且确保它出售的每个鸡蛋盒都是一个完整的盒子,包含6个鸡蛋。
Review[] reviews = //result;
return Arrays.stream(reviews)
   .filter(r -> r != null)
   .toArray(Review[]::new);