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

Как можно настроить 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; 
}

Ответ 1

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

<Предварительно > <код > mapper.setSerializationInclusion(Include.NON_NULL); Код >

или

<Предварительно > <код > @JsonInclude (Include.NON_NULL) класс Foo { Строка; } Код >

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

Более полный пример доступен в мой ответ в Как предотвратить нулевые значения внутри карты и null поля внутри bean от сериализации через Джексон.

Ответ 2

С Jackson > 1.9.11 и < 2.x используйте @JsonSerialize аннотацию для этого:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)

Ответ 3

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

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

public class Foo {

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

    private String fieldTwo;
}

Чтобы опустить все нулевые значения в классе по умолчанию, аннотируйте класс. Аннотации для каждого поля/получателя все еще можно использовать для переопределения этого значения по умолчанию, если это необходимо.

пример - здесь fieldOne и fieldTwo будут опущены из 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 задолго до того, как я обновил свой ответ, чтобы использовать его!

Ответ 4

В Jackson 2.x используйте:

@JsonInclude(JsonInclude.Include.NON_NULL)

Ответ 5

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

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

Начиная с версии 2.5 вы можете:

mapper.setSerializationInclusion(Include.NON_NULL);

Ответ 7

в моем случае

@JsonInclude(Include.NON_EMPTY)

заставил его работать.

Ответ 8

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

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

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

Ответ 9

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

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

Ответ 11

Это будет работать при загрузке spring 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
}

Ответ 12

Для использования Jackson 2.5:

@JsonInclude(content=Include.NON_NULL)

Ответ 13

Это беспокоило меня в течение некоторого времени, и я, наконец, нашел проблему. Проблема была вызвана неправильным импортом. Раньше я использовал

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)

Ответ 14

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

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, вы можете получить ObjectMapper, используемый Джерси, используя environment.getObjectMapper()

Ответ 15

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

<Предварительно > <код > @Configuration открытый класс JsonConfigurations {   @Bean  public Jackson2ObjectMapperBuilder objectMapperBuilder() {       Jackson2ObjectMapperBuilder builder = новый Jackson2ObjectMapperBuilder();       builder.serializationInclusion(JsonInclude.Include.NON_NULL);       builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);       builder.failOnUnknownProperties(ложный);       return builder;   } } Код >

Ответ 16

Jackson 2.x + используйте

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

Ответ 17

Кроме того, вы должны изменить свой подход при использовании 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