library example databind java jackson

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)



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á 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.