返回

如何让 Jackson 优雅地忽略序列化时的 null 字段?

java

如何在序列化时让 Jackson 忽略值为 null 的字段?

问题:

Jackson 是一个流行的 Java 库,用于将对象序列化为 JSON。但是,默认情况下,Jackson 会将所有字段序列化到 JSON 中,即使字段值为 null。这可能会导致 JSON 的大小增加和性能下降。

解决方法:

要解决此问题,我们可以使用 @JsonInclude 注解。此注解允许我们指定要序列化的字段的条件,其中包括忽略值为 null 的字段。

使用 @JsonInclude 注解

@JsonInclude 注解具有以下选项:

  • JsonInclude.Include.NON_NULL:仅序列化非 null 值。
  • JsonInclude.Include.NON_EMPTY:仅序列化非 null 且非空值的。
  • JsonInclude.Include.NON_DEFAULT:仅序列化非 null 且不等于默认值的。

要忽略值为 null 的字段,我们可以使用 JsonInclude.Include.NON_NULL 选项。

以下是如何使用 @JsonInclude 注解:

import com.fasterxml.jackson.annotation.JsonInclude;

public class SomeClass {

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

}

使用此注解后,Jackson 将只在 someValue 字段不为 null 时才将其序列化到 JSON 中。

示例代码

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {

    public static void main(String[] args) throws JsonProcessingException {

        // 创建一个 SomeClass 实例
        SomeClass someClass = new SomeClass();

        // 使用 Jackson 将对象序列化为 JSON
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(someClass);

        // 打印 JSON
        System.out.println(json);

    }

}

输出:

{}

正如你所看到的,即使 someValue 字段的值为 null,它也不会被序列化到 JSON 中。

常见问题解答

  1. 我可以在没有 @JsonInclude 注解的情况下忽略 null 值吗?

    不,默认情况下,Jackson 会将所有字段序列化到 JSON 中,无论其值是否为 null。

  2. 我可以仅忽略特定字段的值为 null 吗?

    是的,你可以使用 @JsonInclude 注解的 include 属性来指定要忽略特定字段的值为 null。

  3. 除了忽略 null 值之外,@JsonInclude 注解还有其他选项吗?

    是的,@JsonInclude 注解还允许你指定仅序列化非空值或非默认值。

  4. 我应该在何时使用 @JsonInclude 注解?

    你应该在以下情况下使用 @JsonInclude 注解:

    • 当你想要减少 JSON 的大小时
    • 当你想要提高序列化和反序列化的性能时
    • 当你想要提高 JSON 的可读性时
  5. @JsonInclude 注解适用于所有 Jackson 序列化器吗?

    @JsonInclude 注解适用于所有 Jackson 序列化器,包括 ObjectMapperJsonGenerator