如何告诉 Jackson 在序列化过程中忽略某个字段(如果其值为 null)?

2022-08-31 04:05:40

如何将 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; 
}

答案 1

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

mapper.setSerializationInclusion(Include.NON_NULL);

艺术

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

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

一个更完整的示例可以在我对如何防止Map内的空值和Bean内的空字段通过Jackson进行序列化的回答中。


答案 2

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

示例 - 此处仅在 JSON 为 null 时从 JSON 中省略。 将始终包含在 JSON 中,无论它是否为空。fieldOnefieldTwo

public class Foo {

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

    private String fieldTwo;
}

若要将类中的所有 null 值作为默认值省略,请对该类进行批注。如有必要,仍可使用每字段/getter 批注来覆盖此默认值。

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

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

    private String fieldOne;

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

更新

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

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 

而不是

@JsonInclude(JsonInclude.Include.NON_NULL)

如果此更新有用,请在下面对ZiglioUK的答案投赞成票,它指出了较新的Jackson 2注释,早在我更新我的答案以使用它之前!


推荐