如果值为null,如何告诉Jackson在序列化期间忽略某个字段?

ams*_*ams 658 java jackson

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

例如:

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; 
}
Run Code Online (Sandbox Code Playgroud)

Pro*_*uce 1063

要使用Jackson> 2.0禁止使用空值序列化属性,可以直接配置ObjectMapper或使用@JsonInclude注释:

mapper.setSerializationInclusion(Include.NON_NULL);
Run Code Online (Sandbox Code Playgroud)

要么:

@JsonInclude(Include.NON_NULL)
class Foo
{
  String bar;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以@JsonInclude在getter中使用,以便在值不为null时显示该属性.

一个更完整的例子是在提供我的回答如何防止豆内的地图内,空值空字段从通过杰克逊得到连载.

  • 对于我的项目,这工作:`@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)`; 不知何故,你的注释不可用. (80认同)
  • 是的,我刚刚确认`@JsonInclude`符号不起作用,但这就像一个魅力:`@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)`(我正在使用Jackson 1.9.12和Spring 3.2. 2.) (19认同)
  • @MartinAsenov - 答案显示了最新的API; 它从`@JsonSerialize`语法改为`@JsonInclude`.不推荐使用旧语法. (16认同)
  • API在2.0版本中发生了一些变化. (12认同)
  • @ProgrammerBruce -1会相应地更改您的答案,因为您知道这一变化. (10认同)
  • 如果序列化可能具有空数组的对象,NON_EMPTY将执行这一操作:`@JsonInclude(JsonInclude.Include.NON_EMPTY)` (2认同)
  • 一些软件仍然停留在 2016 年的 1.9 版 - 如果没有大胆的通知,这个答案是非常不方便的浪费时间。 (2认同)

WTK*_*WTK 125

使用Jackson> 1.9.11和<2.x使用@JsonSerialize注释来做到这一点:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)

  • @JsonInclude(JsonInclude.Include.NON_NULL) (36认同)
  • 如今(杰克逊2.x)这种方法已被弃用. (10认同)
  • `@JsonSerialize(using = FooSerializer.class,include = JsonSerialize.Inclusion.NON_NULL)`不起作用.可空值可序列化. (2认同)
  • 它已被弃用,但如果您需要维护旧东西,这个答案完全没问题!所以谢谢@WTK :) (2认同)

dav*_*wil 116

只是为了扩展其他答案 - 如果你需要在每个字段的基础上控制遗漏空值,请注释相关字段(或者注释字段的'getter').

例子 -fieldOne如果它是null,这里只会从json中省略.fieldTwo将始终包括在内,无论它是否为null.

public class Foo {

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

    private String fieldTwo;
}
Run Code Online (Sandbox Code Playgroud)

要将类中的所有空值省略为默认值,请注释该类.如有必要,仍可使用按字段/ getter注释覆盖此默认值.

示例 -此处fieldOne并且fieldTwo如果它们分别为null,将从json中省略,因为这是类注释的默认设置.fieldThree但是,由于字段上的注释,它将覆盖默认值并始终包含在内.

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

    private String fieldOne;

    private String fieldTwo;

    @JsonInclude(JsonInclude.Include.ALWAYS)
    private String fieldThree;
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

以上是杰克逊2.对于早期版本的Jackson,您需要使用:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 
Run Code Online (Sandbox Code Playgroud)

代替

@JsonInclude(JsonInclude.Include.NON_NULL)
Run Code Online (Sandbox Code Playgroud)

如果这个更新很有用,请在下面提到ZiglioUK的答案,它在我更新我的答案之前很久就指出了更新的Jackson 2注释!


Zig*_*oUK 58

在Jackson 2.x中,使用:

@JsonInclude(JsonInclude.Include.NON_NULL)
Run Code Online (Sandbox Code Playgroud)

  • 为什么/如何使用2.5.1不起作用? (2认同)

Ere*_*maz 36

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

mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);
Run Code Online (Sandbox Code Playgroud)

从2.5开始你可以用户:

mapper.setSerializationInclusion(Include.NON_NULL);
Run Code Online (Sandbox Code Playgroud)

  • ..或直接:mapper.setSerializationInclusion(NON_NULL); (7认同)
  • 这是不推荐使用的. (3认同)
  • 由于这在1.9中已弃用,请使用mapper.getSerializationConfig().withSerializationInclusion(JsonSerialize.Inclusion.NON_NULL); (3认同)

小智 21

你可以设置application.properties:

spring.jackson.default-property-inclusion=non_null
Run Code Online (Sandbox Code Playgroud)

或者application.yaml:

spring:
  jackson:
    default-property-inclusion: non_null
Run Code Online (Sandbox Code Playgroud)

http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html


alf*_*han 12

在我的情况下

@JsonInclude(Include.NON_EMPTY)
Run Code Online (Sandbox Code Playgroud)

使它工作.

  • NON_EMPTY与NON_NULL略有不同-它将忽略空值,这是正确的,但是*也*会忽略被认为为空的值,这可能不是您期望的行为。有关更多信息,请参见Jackson [javadocs](http://fasterxml.github.io/jackson-annotations/javadoc/2.7/) (2认同)

Neh*_*war 8

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
Run Code Online (Sandbox Code Playgroud)

应该管用.

Include.NON_EMPTY表示如果属性的值不为null且不为空,则序列化该属性. Include.NON_NULL表示如果属性值不为null,则序列化该属性.

  • `JsonInclude.Include.NON_EMPTY`-足够了,因为它涵盖了NOT_NULL的情况 (2认同)

Ili*_*tov 5

如果要将此规则添加到Jackson 2.6+中的所有模型,请使用:

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
Run Code Online (Sandbox Code Playgroud)


acd*_*ior 5

如果在Spring Boot中,您可以ObjectMapper直接通过属性文件自定义jackson .

示例application.yml:

spring:
  jackson:
    default-property-inclusion: non_null # only include props if non-null
Run Code Online (Sandbox Code Playgroud)

可能的值是:

always|non_null|non_absent|non_default|non_empty
Run Code Online (Sandbox Code Playgroud)

更多:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper


Dev*_*eva 5

这将在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
}
Run Code Online (Sandbox Code Playgroud)