如何告诉杰克逊在序列化过程中忽略一个字段,如果它的值为null?

如果该字段的值为null,如何将Jackson配置为在序列化期间忽略该字段值。

例如:

public class SomeClass {// what jackson annotation causes jackson to skip over this value if it is null but will// serialize it otherwiseprivate String someValue;}
765075 次浏览

要使用Jackson>2.0禁止使用空值的序列化属性,您可以直接配置#0,或使用@JsonInclude注释:

mapper.setSerializationInclusion(Include.NON_NULL);

或:

@JsonInclude(Include.NON_NULL)class Foo{String bar;}

或者,您可以在getter中使用@JsonInclude,以便在值不为空时显示属性。

更完整的示例在如何防止Map中的null值和bean中的null字段通过Jackson序列化1464975">我的答案到如何防止Map中的null值和bean中的null字段通过Jackson序列化中可用。

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

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

从2.5开始,您可以使用:

mapper.setSerializationInclusion(Include.NON_NULL);

对于Jackson>1.9.11和<2. x,使用@JsonSerialize注释来执行此操作:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)

只是为了扩展其他答案-如果您需要在每个字段的基础上控制空值的遗漏,请注释有问题的字段(或者注释字段的'getter')。

示例-这里只有fieldOne会从JSON中省略,如果它为null。fieldTwo将始终包含在JSON中,无论它是否为null。

public class Foo {
@JsonInclude(JsonInclude.Include.NON_NULL)private String fieldOne;
private String fieldTwo;}

要省略类中的所有空值作为默认值,请注释类。如有必要,仍可使用每字段/getter注释来覆盖此默认值。

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

@JsonInclude(JsonInclude.Include.NON_NULL)public class Foo {
private String fieldOne;
private String fieldTwo;    
@JsonInclude(JsonInclude.Include.ALWAYS)private String fieldThree;}

更新

以上是杰克逊2。对于杰克逊的早期版本,您需要使用:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)

而不是

@JsonInclude(JsonInclude.Include.NON_NULL)

如果此更新有用,请在下面投票ZiglioUK的答案,它早在我更新答案以使用它之前就指出了较新的Jackson 2注释!

在Jackson 2. x中,使用:

@JsonInclude(JsonInclude.Include.NON_NULL)

Jackson 2. x+使用

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

在我的情况下

@JsonInclude(Include.NON_EMPTY)

成功了。

对于Jackson 2.5使用:

@JsonInclude(content=Include.NON_NULL)

如果要将此规则添加到Jackson 2.6+中的所有模型,请使用:

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
@JsonInclude(JsonInclude.Include.NON_NULL)@JsonInclude(JsonInclude.Include.NON_EMPTY)

应该工作。

Include.NON_EMPTY表示如果属性的值不为空且不为空,则该属性被序列化。Include.NON_NULL表示如果属性的值不为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)

您可以设置application.properties

spring.jackson.default-property-inclusion=non_null

application.yaml

spring:jackson:default-property-inclusion: non_null

http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

如果您尝试序列化对象列表并且其中一个为null,您最终会在JSON中包含null项,即使使用

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

将导致:

[{myObject},null]

为了得到这个:

[{myObject}]

一个人可以这样做:

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

提示:如果您使用的是DropWizard,您可以使用environment.getObjectMapper()检索泽西使用的ObjectMapper

如果在Spring Boot中,您可以直接通过属性文件自定义jacksonObjectMapper

示例application.yml

spring:jackson:default-property-inclusion: non_null # only include props if non-null

可能的值是:

always|non_null|non_absent|non_default|non_empty

更多:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper

如果您使用Spring,则进行全局配置

@Configurationpublic class JsonConfigurations {
@Beanpublic Jackson2ObjectMapperBuilder objectMapperBuilder() {Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();builder.serializationInclusion(JsonInclude.Include.NON_NULL);builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);builder.failOnUnknownProperties(false);return builder;}
}

这将在Spring Boot 2.0.3+和Jackson 2.0+中工作

import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_NULL)public class ApiDTO{// your class variable and// methods}

此外,您必须更改使用Map myVariable时的方法,如留档中所述以消除空值:

From documentation:com.fasterxml.jackson.annotation.JsonInclude
@JacksonAnnotation@Target(value={ANNOTATION_TYPE, FIELD, METHOD, PARAMETER, TYPE})@Retention(value=RUNTIME)Annotation used to indicate when value of the annotated property (when used for a field, method or constructor parameter), or all properties of the annotated class, is to be serialized. Without annotation property values are always included, but by using this annotation one can specify simple exclusion rules to reduce amount of properties to write out.
*Note that the main inclusion criteria (one annotated with value) is checked on Java object level, for the annotated type, and NOT on JSON output -- so even with Include.NON_NULL it is possible that JSON null values are output, if object reference in question is not `null`. An example is java.util.concurrent.atomic.AtomicReference instance constructed to reference null value: such a value would be serialized as JSON null, and not filtered out.
To base inclusion on value of contained value(s), you will typically also need to specify content() annotation; for example, specifying only value as Include.NON_EMPTY for a {link java.util.Map} would exclude Maps with no values, but would include Maps with `null` values. To exclude Map with only `null` value, you would use both annotations like so:public class Bean {@JsonInclude(value=Include.NON_EMPTY, content=Include.NON_NULL)public Map<String,String> entries;}
Similarly you could Maps that only contain "empty" elements, or "non-default" values (see Include.NON_EMPTY and Include.NON_DEFAULT for more details).In addition to `Map`s, `content` concept is also supported for referential types (like java.util.concurrent.atomic.AtomicReference). Note that `content` is NOT currently (as of Jackson 2.9) supported for arrays or java.util.Collections, but supported may be added in future versions.Since:2.0

这个问题我们有很多答案,这个答案在某些情况下可能会有帮助如果要忽略空值,可以在类级别使用NOT_NULL。如下

@JsonInclude(Include.NON_NULL)class Foo{String bar;}

有时您可能需要忽略空值,例如您可能已经初始化了arrayList,但该列表中没有元素。那时使用NOT_EMPTY注释来忽略那些空值字段

@JsonInclude(Include.NON_EMPTY)class Foo{String bar;}

案例一

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

案例二

@JsonInclude(JsonInclude.Include.NON_EMPTY)private String someString;

如果someString为null,则在这两种情况下都会忽略它。如果someString是“”,它只是在第二种情况下被忽略。

List = nullList.size() = 0也一样

试试这个-

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)public class XYZ {    
protected String field1;    
protected String field2;}

对于非空值(在getters/class级别)-

@JsonSerialize(include=JsonSerialize.Inclusion.NON_EMPTY)