java - 如果杰克逊在序列化过程中忽略某个字段的值是否为空,该怎么办?


杰克逊如何配置为在序列化期间忽略字段值,如果该字段的值为空。

例如:

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; 
}

Answers






随着杰克逊> 1.9.11和<2.x使用@JsonSerialize注释来做到这一点:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)




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

例如 -这里只有fieldOne将被从json中省略,如果它是空的。 fieldTwo将始终包含在内,无论它是否为null。

public class Foo {

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

    private String fieldTwo;
}

要省略类中的所有空值作为默认值,请注释该类。 如果有必要的话,仍然可以使用per-field / getter注释覆盖这个默认值。

例如 -这里fieldOnefieldTwo将分别从null,因为这是默认的类注释设置将被省略。 fieldThree将覆盖默认值,并且将始终包含在内,因为字段上的注释。

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

    private String fieldOne;

    private String fieldTwo;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String fieldThree;
}

更新 使用杰克逊2 - 早期版本的杰克逊使用

@JsonSerialize(include=JsonSerialize.Inclusion.ALWAYS) 

代替

@JsonInclude(JsonInclude.Include.NON_NULL)

如果这个更新是有用的,请在下面提出ZiglioUK的答案,它在这个更新之前就指出了这个更新的注释!




在Jackson 2.x中,使用:

@JsonInclude(JsonInclude.Include.NON_NULL)



您可以使用以下映射器配置:

mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);

由于2.5你可以用户:

mapper.setSerializationInclusion(Include.NON_NULL);



在我的情况

@JsonInclude(Include.NON_EMPTY)

使其工作。




@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonInclude(JsonInclude.Include.NON_EMPTY)

应该管用。

Include.NON_EMPTY表示属性被序列化,如果它的值不为空而不是空的。 Include.NON_NULL表示属性被序列化,如果它的值不为空。




如果你想添加这个规则到杰克逊2.6+的所有模型使用:

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);



对于杰克逊2.5使用:

@JsonInclude(content=Include.NON_NULL)






这一直困扰着我很长一段时间,我终于找到了问题。 这个问题是由于一个错误的进口。 早些时候我一直在使用

com.fasterxml.jackson.databind.annotation.JsonSerialize

哪些已被弃用。 只需更换导入

import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;

并将其用作

@JsonSerialize(include=Inclusion.NON_NULL)



杰克逊2.x +使用

mapper.getSerializationConfig().withSerializationInclusion(JsonInclude.Include.NON_NULL);



如果你试图序列化一个对象列表,其中一个是null,那么你最终会在json中包含null项,即使

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

将导致:

[{myObject的},空]

得到这个:

[{myObject的}]

可以做一些事情:

mapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
        @Override
        public void serialize(Object obj, JsonGenerator jsonGen, SerializerProvider unused)
                throws IOException
        {
            //IGNORES NULL VALUES!
        }
    });

提示:如果你使用的是DropWizard,你可以使用environment.getObjectMapper()来检索Jersey使用的ObjectMapper。