【发布时间】:2018-02-11 18:40:45
【问题描述】:
在我的 Spring Boot 应用程序中,当我编写了一个类并且我想在序列化时从该类的对象中排除 null 值,我只是用 @JsonInclude(Include.NON_NULL) 注释该类,或者我分配属性 @987654324 @ 在我的属性文件中。
但现在我有一个控制器,它返回我的类的 Java 数组(不是 Collection):
@RequestMapping(path = "/reviews", method = GET, produces = APPLICATION_JSON_VALUE)
public Review[] searchReviews(@RequestParam Map<String, String> params) {
而且很多时候这个数组是不完整的,在这种情况下我会得到null 来表示没有项目的位置。
我如何告诉 Jackson 在序列化 Java 数组时忽略存在于 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 数组需要具有固定长度这一事实是否与此有关?
我应该怎么做才能将一个java数组:大小为3的[object1, object2, null]转换为[{}, {}]而不是[{}, {}, null]?
【问题讨论】:
-
做正确的事,不要返回部分填充的数组。甚至根本不返回数组。返回 List
(或 Set )。做正确的事会有所帮助。您不应该尝试调整 Jackson 来弥补代码中的设计问题。你应该解决设计问题。 -
不确定 jackson,但您可以使用 java 8 流过滤值 != null 的数组,然后将流收集回数组
-
@JBNizet 为什么这不是正确的事情?我的要求是返回前 20 条评论。我返回了包含 20 条评论的数组。如果没有足够的评论,则数组中存在 null。我可以使用
List<Review>来做到这一点,但在这样做之前,我很想知道为什么这不是一件正确的事情。您能提供一些见解吗? -
因为当 API 返回一个评论数组时,客户端期望返回一个包含评论的数组。不是一个数组,其中一半元素是评论,另一半为空,因此客户端必须计算非空元素的数量才能知道它实际包含多少评论(而不仅仅是使用 list.size() ),并且必须在各处添加空检查以避免 NPE,如果 API 首先返回非空评论列表,则不需要这样做。
-
如果你去商店买鸡蛋,你会开心吗?你必须打开每个鸡蛋盒来检查它实际上包含 6 个鸡蛋,而不是 2 个或 4 个或 5 个?不。这家商店做的事情是正确的,确保它销售的每个鸡蛋盒都是一个完整的盒子,里面有 6 个鸡蛋。
标签: java arrays spring-boot serialization jackson