Jackson忽略null字段的3种方法

使用Jackson进行对象序列化时,默认会输出值为null的字段。

很多时候,序列化null字段是没有意义的。如果想忽略null字段,一起来看看Jackson提供的几种方法。

本篇内容基于Jackson 2.11.2版本,马上开始学习吧。

默认序列化null字段

首先,看看默认情况下,默认序列化null字段的情况。

public class Animal {

    private String name;
    private int sex;
    private Integer weight;

    // 省略getter、setter方法

    @Override
    public String toString() {
        return "Animal [name=" + name + ", sex=" + sex + ", weight=" + weight + "]";
    }

}
/**
 * 默认会输出null字段
 * 
 * @throws JsonProcessingException 
 */
@Test
public void outputNull() throws JsonProcessingException {
    Animal animal = new Animal();
    animal.setName("sam");
    animal.setSex(1);

    ObjectMapper mapper = new ObjectMapper();
    System.out.println(mapper.writeValueAsString(animal));
}

执行结果:

{"name":"sam","sex":1,"weight":null}

由于weight字段没有设置,默认序列化输出null值。

全局忽略值为null的字段

调用ObjectMapper的setSerializationInclusion方法,将序列化包含规则设置为JsonInclude.Include.NON_NULL。

JsonInclude.Include.NON_NULL,表示序列化时不包含值为null的字段。

基于ObjectMapper的设置,都是全局性的。也就是说,只要使用了该ObjectMapper的操作,都会受其设置的影响。

/**
 * 全局忽略值为null的字段
 * 
 * @throws JsonProcessingException 
 */
@Test
public void nonNullForGlobal() throws JsonProcessingException {
    Animal animal = new Animal();
    animal.setName("sam");
    animal.setSex(1);

    ObjectMapper mapper = new ObjectMapper();

    // 指定序列化时的包含规则,NON_NULL表示序列化时忽略值为null的字段
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    System.out.println(mapper.writeValueAsString(animal));
}

执行结果:

{"name":"sam","sex":1}

类范围忽略值为null的字段

Jackson提供了一个注解@JsonInclude,可以用来忽略某个类的null字段。

@JsonInclude(JsonInclude.Include.NON_NULL) // 序列化时忽略所有值为null的字段
public class Animal2NonNull {

    private String name;
    private int sex;
    private Integer weight;

    // 省略getter、setter方法
}
/**
 * 类范围忽略值为null的字段.<br>
 * 为类添加@JsonInclude(JsonInclude.Include.NON_NULL)注解,值为null的所有字段都不做序列化
 * 
 * @throws JsonProcessingException
 */
@Test
public void nonNullClassFieldsAnnotation() throws JsonProcessingException {
    Animal2NonNull animal = new Animal2NonNull();
    animal.setSex(26);

    ObjectMapper mapper = new ObjectMapper();
    System.out.println(mapper.writeValueAsString(animal)); // 不输出name和weight
}

执行结果:

{"sex":26}

忽略值为null的某个字段

@JsonInclude注解还可以作用于某个具体的字段,用来忽略指定的字段。

public class Animal2NonNull {

    private String name;
    private int sex;
    @JsonInclude(JsonInclude.Include.NON_NULL) // 如果字段值为null,则不进行序列化
    private Integer weight;

    // 省略getter、setter方法
}
/**
 * 忽略值为null的某个字段.<br>
 * 为字段添加@JsonInclude(JsonInclude.Include.NON_NULL)注解,字段值为null时不做序列化
 * 
 * @throws JsonProcessingException
 */
@Test
public void nonNullFieldAnnotation() throws JsonProcessingException {
    Animal2NonNull animal = new Animal2NonNull();
    animal.setSex(26);

    ObjectMapper mapper = new ObjectMapper();
    System.out.println(mapper.writeValueAsString(animal)); // 不输出weight
}

执行结果:

{"name":null,"sex":26}

小结

使用Jackson进行对象序列化时,默认会输出值为null的字段。

本文总结了3种用于忽略null字段的方法,分别对应于全局、类和字段3种范围。

1.全局忽略值为null的字段;
2.类范围忽略值为null的字段;
3.忽略值为null的某个字段。

参考

《轻松学习Jackson》做程序员身边的开发手册

https://github.com/FasterXML/jackson-databind/


---转载本站文章请注明作者和出处 996极客教程(996geek.com),请勿用于任何商业用途---

留下评论