Jackson 忽略值为null的字段

作者 | 2020年3月28日

在Jackson中,我们可以使用@JsonInclude(JsonInclude.Include.NON_NULL)来忽略值null的字段。

PS:本文在Jaxkson 2.9.8下测试通过

1. Jackson默认包括值为null的字段

1.1 先来定义一个POJO,稍后会用到。

Staff.java

public class Staff {

    private String name;
    private int age;
    private String[] position;               
    private List<String> skills;            
    private Map<String, BigDecimal> salary; 

1.2 默认情况下,Jackson会包含值为null的字段。

JacksonExample.java

package cc.myexample;

import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;

public class JacksonExample {

    public static void main(String[] args) {

        ObjectMapper mapper = new ObjectMapper();

        Staff staff = new Staff("mkyong", 38);

        try {

            String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(staff);

            System.out.println(json);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

输出

{
  "name" : "mkyong",
  "age" : 38,
  "position" : null,
  "skills" : null,
  "salary" : null
}

要忽略值为null的字段可以在类或字段定义上使用@JsonInclude注解。

2. 在类上使用@JsonInclude注解

Staff.java

import com.fasterxml.jackson.annotation.JsonInclude;

// 在类定义上忽略值为null的字段
@JsonInclude(JsonInclude.Include.NON_NULL)  //  忽略值为null的字段
public class Staff {

    private String name;
    private int age;
    private String[] position;              
    private List<String> skills;           
    private Map<String, BigDecimal> salary; 
    //...

输出

{
  "name" : "mkyong",
  "age" : 38
}

3. 在字段上使用@JsonInclude注解

Staff.java

import com.fasterxml.jackson.annotation.JsonInclude;

public class Staff {

    private String name;
    private int age;

    @JsonInclude(JsonInclude.Include.NON_NULL) //如果该字段的值为null则忽略,只对这一个字段有效
    private String[] position;              

    @JsonInclude(JsonInclude.Include.NON_NULL) //如果该字段的值为null则忽略,只对这一个字段有效
    private List<String> skills;           

    private Map<String, BigDecimal> salary;

输出

{
  "name" : "mkyong",
  "age" : 38,
  "salary" : null
}

4. ObjectMapper.setSerializationInclusion

此外,我们还可以使忽略值为null的字段全局生效。

JacksonExample2.java

package cc.myexample;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;

public class JacksonExample2 {

    public static void main(String[] args) {

        ObjectMapper mapper = new ObjectMapper();

        Staff staff = new Staff("mkyong", 38);

        try {

            // 全局忽略值为null的字段
            mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

            String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(staff);

            System.out.println(json);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

输出

{
  "name" : "mkyong",
  "age" : 38
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注