java - example - ¿Cómo decirle a Jackson que ignore un campo durante la serialización si su valor es nulo?
objectmapper java (15)
¿Cómo se puede configurar Jackson para ignorar un valor de campo durante la serialización si el valor de ese campo es nulo?
Por ejemplo:
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;
}
Con Jackson> 1.9.11 y <2.x use la anotación @JsonSerialize
para hacer eso:
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
Configuración global si usas 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;
}
}
En Jackson 2.x, usa:
@JsonInclude(JsonInclude.Include.NON_NULL)
Esto me ha estado preocupando por bastante tiempo y finalmente encontré el problema. El problema se debió a una importación incorrecta. Antes había estado usando
com.fasterxml.jackson.databind.annotation.JsonSerialize
Que había sido desaprobado. Solo reemplaza la importación por
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
y usarlo como
@JsonSerialize(include=Inclusion.NON_NULL)
Jackson 2.x + uso
mapper.getSerializationConfig().withSerializationInclusion(JsonInclude.Include.NON_NULL);
Para suprimir las propiedades de serialización con valores nulos usando Jackson> 2.0, puede configurar el ObjectMapper
directamente , o hacer uso de la anotación @JsonInclude
:
mapper.setSerializationInclusion(Include.NON_NULL);
o:
@JsonInclude(Include.NON_NULL)
class Foo
{
String bar;
}
Alternativamente, puede usar @JsonInclude
en un getter para que el atributo se muestre si el valor no es nulo.
Un ejemplo más completo está disponible en mi respuesta a Cómo evitar que los valores nulos dentro de un Mapa y los campos nulos dentro de un bean se serialicen a través de Jackson .
Para uso de Jackson 2.5:
@JsonInclude(content=Include.NON_NULL)
Puede establecer application.properties
:
spring.jackson.default-property-inclusion=non_null
o application.yaml
:
spring:
jackson:
default-property-inclusion: non_null
http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Puedes usar la siguiente configuración de mapeador:
mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);
Desde 2.5 puedes usar:
mapper.setSerializationInclusion(Include.NON_NULL);
Si desea agregar esta regla a todos los modelos en Jackson 2.6+ use:
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
Si está en Spring Boot , puede personalizar el ObjectMapper
jackson directamente a través de archivos de propiedades.
Ejemplo application.yml
:
spring:
jackson:
default-property-inclusion: non_null # only include props if non-null
Los valores posibles son:
always|non_null|non_absent|non_default|non_empty
Si está intentando serializar una lista de objetos y uno de ellos es nulo, terminará incluyendo el elemento nulo en el json incluso con
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
resultará en:
[{myObject}, null]
para obtener esto:
[{myObject}]
uno puede hacer algo como:
mapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
@Override
public void serialize(Object obj, JsonGenerator jsonGen, SerializerProvider unused)
throws IOException
{
//IGNORES NULL VALUES!
}
});
SUGERENCIA: Si está utilizando DropWizard, puede recuperar el ObjectMapper que está utilizando Jersey utilizando environment.getObjectMapper ()
Solo para ampliar las otras respuestas, si necesita controlar la omisión de valores nulos por campo, anote el campo en cuestión (o anote también el "captador" del campo).
Ejemplo: aquí solo se fieldOne
fieldOne de json si es nulo. fieldTwo
siempre se incluirá independientemente de si es nulo.
public class Foo {
@JsonInclude(JsonInclude.Include.NON_NULL)
private String fieldOne;
private String fieldTwo;
}
Para omitir todos los valores nulos en la clase como predeterminados, anote la clase. Las anotaciones por campo / captador aún se pueden usar para anular este valor predeterminado si es necesario.
Ejemplo: aquí se fieldOne
y fieldTwo
de json si son nulos, respectivamente, porque este es el valor predeterminado establecido por la anotación de clase. fieldThree
embargo, fieldThree
anulará el valor predeterminado y siempre se incluirá, debido a la anotación en el campo.
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Foo {
private String fieldOne;
private String fieldTwo;
@JsonInclude(JsonInclude.Include.ALWAYS)
private String fieldThree;
}
ACTUALIZAR
Lo anterior es para Jackson 2 . Para versiones anteriores de Jackson necesitas usar:
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
en lugar de
@JsonInclude(JsonInclude.Include.NON_NULL)
Si esta actualización es útil, por favor, apruebe la respuesta de ZiglioUK a continuación, ¡señaló la nueva anotación de Jackson 2 mucho antes de que actualice mi respuesta para usarla!
en mi caso
@JsonInclude(Include.NON_EMPTY)
lo hizo funcionar
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
Deberia trabajar.
Include.NON_EMPTY
indica que la propiedad se serializa si su valor no es nulo y no está vacío. Include.NON_NULL
indica que la propiedad se serializa si su valor no es nulo.