Jackson 序列化 - 忽略未设置的值,但提供明确设置为 null 的值

Posted

技术标签:

【中文标题】Jackson 序列化 - 忽略未设置的值,但提供明确设置为 null 的值【英文标题】:Jackson serialization - ignore not set values but provide values explicitly set to null 【发布时间】:2020-10-05 19:59:50 【问题描述】:

在我的 Spring Boot REST 应用程序中,我确实希望在没有明确设置类的属性时,Jackson 应该忽略它们。但如果它们设置为null,则应提供并序列化它们。

@JsonInclude(Include.NON_NULL) 忽略 null 值,但在实际未设置的值和已明确设置为 null 的值之间没有区别。

检查以下示例(使用 Lombok),它显示了我想要在这里实现的目标:

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Example 
  @JsonProperty("name")
  private String name;

  @JsonProperty("test")
  private String test;

Example.builder().test("test").build() 应该导致 test: "test"Example.builder().name(null).test("test).build() 应该导致 name: NULL, test: "test"

实现这一目标的最佳方法是什么?

【问题讨论】:

【参考方案1】:

在 Java 中,您的属性在未设置时将为空。因此,除非您添加某种标志以知道何时实际设置了属性(甚至为空),否则您无法实现您想要的。也就是说,未设置的属性和设置为 null 的属性之间没有区别。如果您确实添加了一个“isSet”标志(可能是一个映射,因为它的每个属性都有一个标志),那么您可能需要一个自定义 Jackson 映射器来读取“isSet”标志并采取相应的行动。

【讨论】:

【参考方案2】:

这可以使用Optional 字段来实现:

public class JsonTest 
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @Getter
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    static class Example 
        private Optional<String> name;
        private Optional<String> test;
    

    public static void main(String[] args) throws JsonProcessingException 
        ObjectMapper mapper = new ObjectMapper().registerModule(new Jdk8Module());

        Example[] examples = 
                new Example(),
                Example.builder().name(Optional.of("exampleName")).build(),
                Example.builder().name(Optional.of("exampleName")).test(Optional.empty()).build(),
        ;

        for (Example ex : examples) 
            System.out.println(mapper.writeValueAsString(ex));
        
    

输出:


"name":"exampleName"
"name":"exampleName","test":null

【讨论】:

是的,但是,它只适用于序列化:)

以上是关于Jackson 序列化 - 忽略未设置的值,但提供明确设置为 null 的值的主要内容,如果未能解决你的问题,请参考以下文章

忽略 Jackson 序列化的特定字段

Jackson序列化生成 json 不同场景下忽略字段

Jackson 序列化:忽略空值(或 null)

Jackson 序列化:如何忽略超类属性

当值为“null”时,Jackson 忽略自定义字段反序列化器

Jackson(使用注解)