Как сказать Джексону игнорировать поле во время сериализации, если его значение null?

как можно настроить Jackson для игнорирования значения поля во время сериализации, если значение этого поля равно null.

например:

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

15 ответов


чтобы подавить сериализацию свойств с нулевыми значениями с помощью Jackson > 2.0, вы можете настройки ObjectMapper напрямую, и @JsonInclude аннотация:

mapper.setSerializationInclusion(Include.NON_NULL);

или:

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

кроме того, вы можете использовать @JsonInclude в геттере, чтобы атрибут был показан, если значение не равно null.

более полный пример содержится в мой ответ: to как предотвратить нулевые значения внутри карта и нулевые поля внутри боба от сериализации через Jackson.


С Джексоном > 1.9.11 и @JsonSerialize аннотация для этого:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)


просто чтобы расширить другие ответы - если вам нужно контролировать пропуск нулевых значений на основе каждого поля, аннотируйте рассматриваемое поле (или альтернативно аннотируйте "геттер" поля).

пример только fieldOne будет ommitted от json, если он равен null. fieldTwo всегда будет включен независимо от того, если он равен null.

public class Foo {

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

    private String fieldTwo;
}

чтобы опустить все значения null в классе по умолчанию, аннотируйте класс. ТВ-Поле/геттер аннотации при необходимости можно использовать для переопределения этого значения по умолчанию.

пример здесь fieldOne и fieldTwo будет ommitted от json, если они равны null, соответственно, потому что это значение по умолчанию, установленное аннотацией класса. 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)

если это обновление полезно, пожалуйста, ответ upvote ZiglioUK ниже, он указал на более новую аннотацию Jackson 2 задолго до того, как я обновил свой ответ, чтобы использовать его!


В Джексоне 2.x, Используйте:

@JsonInclude(JsonInclude.Include.NON_NULL)

вы можете использовать следующую конфигурацию картографа:

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

С 2.5 вы можете пользователь:

mapper.setSerializationInclusion(Include.NON_NULL);

в моем случае

@JsonInclude(Include.NON_EMPTY)

сделал свою работу.


вы можете установить 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


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

должны работать.

Include.NON_EMPTY указывает, что свойство сериализуется, если его значение не null и не пустой. Include.NON_NULL указывает, что свойство сериализуется, если его значение не null.


Если вы хотите добавить это правило ко всем моделям в Jackson 2.6 + используйте:

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

если в Весна Загрузки, вы можете настроить jackson ObjectMapper непосредственно через файлы свойств.

пример 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


для Джексона 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)

Если вы пытаетесь сериализовать список объектов, и один из них равен null, вы в конечном итоге включите нулевой элемент в json даже с

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

в результате:

[{myObject}, null]

для этого:

[{myObject}]

можно сделать что-то вроде:

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

совет: Если вы используете DropWizard, вы можете получить ObjectMapper, используемый Джерси с помощью среды.getObjectMapper ()


глобальная конфигурация, если вы используете Spring

@Configuration
public class JsonConfigurations {

    @Bean
    public Jackson2ObjectMapperBuilder objectMapperBuilder() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.serializationInclusion(JsonInclude.Include.NON_NULL);
        builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
        builder.failOnUnknownProperties(false);
        return builder;
    }

}

Джексон 2.х+ использовать

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