协慌网

登录 贡献 社区

如果字段为空,如何告诉杰克逊在序列化期间忽略该字段?

如果该字段的值为 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; 
}

答案

要使用 Jackson> 2.0 抑制具有空值的序列化属性,可以直接配置ObjectMapper ,或使用@JsonInclude批注:

mapper.setSerializationInclusion(Include.NON_NULL);

或者:

@JsonInclude(Include.NON_NULL)
class Foo
{
  String bar;
}

另外,您可以@JsonInclude ,以便在值不为 null 时显示属性。

如何防止 Map 内的空值和 Bean 内的空字段无法通过 Jackson 序列化的回答提供了一个更完整的示例。

对于 Jackson> 1.9.11 和 < 2.x,请使用@JsonSerialize注释执行此操作:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)

只是为了扩展其他答案 - 如果您需要在每个字段的基础上控制空值的省略,请为有问题的字段添加注释(或为字段的 “getter” 添加注释)。

示例 -如果此处为 null,则从 json 中仅fieldOne无论是否为 null,都会始终包含fieldTwo

public class Foo {

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

    private String fieldTwo;
}

要忽略该类中的所有空值作为默认值,请为该类添加注释。如有必要,仍可以使用按字段 / 获取器的注释来覆盖此默认值。

示例 - 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 批注,而我要更新它的答案才能使用它!