如何告诉Jackson在序列化期间忽略值为null的字段?

858

Jackson如何配置,以在序列化期间忽略某个字段的值,如果该字段的值为null。

例如:

public class SomeClass {
   // what jackson annotation causes jackson to skip over this value if it is null but will 
   // serialize it otherwise 
   private String someValue; 
}
22个回答

1318

90
对于我的项目,这段代码可行:@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL);不知何故你的注解不可用。 - Emmanuel Touzery
14
2.0 版本发布后,API 发生了一些变化。 - Programmer Bruce
12
@ProgrammerBruce,请根据你已经了解的变化更改你的答案。 - Martin Asenov
23
是的,我刚确认了@JsonInclude注解不起作用,但是这个方法非常有效:@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) (我使用的是Jackson 1.9.12和Spring 3.2.2)。 - gstroup
26
答案展示了最近的API;它已经从@JsonSerialize语法更改为@JsonInclude。旧的语法已被弃用。 - Logan Pickup
显示剩余16条评论

189

仅为了扩展其他回答 - 如果您需要针对每个字段控制空值的省略,可以注释相关字段(或者注释字段的“getter”)。

示例 - 如果fieldOne为null,则此处将从JSON中省略它。 fieldTwo无论是否为null,都将始终包含在JSON中。

public class Foo {

    @JsonInclude(JsonInclude.Include.NON_NULL) 
    private String fieldOne;

    private String fieldTwo;
}

为了默认省略类中的所有空值,可以给该类添加注解。如果需要的话,仍然可以使用每个字段/ getter 的注解来覆盖此默认设置。

例如 - 如果 fieldOnefieldTwo 为 null,则它们将分别从 JSON 中省略,因为这是由类注解设置的默认值。但是fieldThree 将始终包括在内,因为它具有字段上的注解,覆盖了默认值。

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Foo {

    private String fieldOne;

    private String fieldTwo;
    
    @JsonInclude(JsonInclude.Include.ALWAYS)
    private String fieldThree;
}

更新

以上适用于Jackson 2。对于早期版本的Jackson,您需要使用:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 

代替

@JsonInclude(JsonInclude.Include.NON_NULL)

如果这个更新有用,请给下面ZiglioUK的答案点赞,它在我更新回答之前就指出了较新的Jackson 2注释!


字段上的注解不应该总是使用“ALWAYS”来覆盖吗? - Abhinav Vishak
@AbhinavVishak 你说得对 - 谢谢!当我更新答案使用Jackson 2时,这是一个复制粘贴的错误。已编辑。 - davnicwil
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 已经被弃用。 - Yar
1
@Yar 是的,在Jackson 2.x中这已经被弃用了。我已经说过,只有在早期版本的Jackson中才需要使用它,因为不仅它没有被弃用,而且也是唯一的选项。 - davnicwil

140

如果使用的是 Jackson > 1.9.11 且 < 2.x 版本,可以使用 @JsonSerialize 注释来实现:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)


11
现在(Jackson 2.x版本)这种方法已经被弃用。 - rustyx
43
@JsonInclude(JsonInclude.Include.NON_NULL) 翻译为:只包含非空值的@JsonInclude。 - ZiglioUK
3
@JsonSerialize(using = FooSerializer.class, include = JsonSerialize.Inclusion.NON_NULL) 无效,可为空的值仍然被序列化。 - herau
3
虽然这个方法已经被弃用了,但如果你需要维护旧的东西,这个答案完全可行!所以感谢 @WTK :) - DominikAngerer
1
顺便提一下,Jackson 1.9.12 是 WebSphere 8.5 中的标准版本,希望这个信息能够为其他人节省我花费的大量时间 :-) - bakoyaro

67

在 Jackson 2.x 中,请使用:

@JsonInclude(JsonInclude.Include.NON_NULL)

这个要放在字段上吗? - ams
1
@ams,这个注解应该包装一个类。 - Edgard Leal
你能否同时包含完全限定名称?Jackson具有多个具有相同名称但不同包的注释,因此存在歧义。 - Vince
你是说在Jackson中有多个@JsonInclude注解吗?我不知道。那么完全限定名应该是什么呢?请随意编辑答案。 - ZiglioUK
名称混淆很可能是由于Jackson 1.x和2.x为了避免类加载器冲突(与不兼容的类版本有关)而使用不同的Java包。由于这个答案是针对2.x的,注释的包将是com.fasterxml.jackson.annotation-- Jackson 1.x使用的是org.codehaus.jackson.annoation - StaxMan

48

您可以使用以下映射器配置:

mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);

从2.5版本开始,您可以使用:

mapper.setSerializationInclusion(Include.NON_NULL);

3
因为这在1.9中已被弃用,所以请使用mapper.getSerializationConfig().withSerializationInclusion(JsonSerialize.Inclusion.NON_NULL); - Asa
7
直接使用:mapper.setSerializationInclusion(NON_NULL); - Asa
@ruslan:可能是因为getSerializationConfig()的文档中写道:请注意,由于实例是不可变的,您无法通过访问实例并调用方法来更改设置:这只会创建配置对象的新实例。 - Zero3
对于2.5.4版本,请使用mapper.setSerializationInclusion(Include.NON_NULL); - Arturo Volpe

47

13

就我的情况而言

@JsonInclude(Include.NON_EMPTY)

做到了。


3
NON_EMPTY与NON_NULL在细微之处略有不同-它将忽略空值,这是正确的,但它还将忽略被认为为空的值,这可能不是所需的行为。有关更多信息,请参见Jackson javadocs - davnicwil
我喜欢这个答案,因为从那些真正可选的事物中返回Optional是一个好主意。如果只使用NON_NULL,对于null值你会得到像{ }这样的东西,这毫无意义地将Java习惯用法传递给了消费者。AtomicReference也是一样--消费者并不关心开发人员选择如何强制执行响应的内部表示的线程安全性。 - Lucas Ross

11
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonInclude(JsonInclude.Include.NON_EMPTY)

Include.NON_EMPTY表示只有在属性的值不为null且非空时才进行序列化。 Include.NON_NULL表示只有在属性的值不为null时才进行序列化。


3
JsonInclude.Include.NON_EMPTY - 足以涵盖 NOT_NULL 的情况,无需额外处理。 - Ilya Buziuk

6

6

这将在Spring Boot 2.0.3+和Jackson 2.0+中起作用。

import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class ApiDTO
{
    // your class variable and 
    // methods
}

1
同样的 @JsonInclude(JsonInclude.Include.NON_NULL) 对我在 Spring Boot 2.1.2Jackson Annotations 2.9.0 上也起作用。 - manasouza
@manasouza 是的,他们对所有更新都保持了一致性。 - Deva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接