Как сказать Джексону игнорировать поле во время сериализации, если его значение 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 задолго до того, как я обновил свой ответ, чтобы использовать его!
вы можете использовать следующую конфигурацию картографа:
mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);
С 2.5 вы можете пользователь:
mapper.setSerializationInclusion(Include.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
@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
это беспокоило меня в течение довольно долгого времени, и я, наконец, нашел проблему. Проблема была вызвана неправильным импортом. Ранее я использовал
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);