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中省略,如果它為null。 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。