¿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;
}
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
; de alguna manera tu anotación no estaba disponible.@JsonInclude
notación no funciona, pero esto funciona de@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
maravilla : (Estoy usando Jackson 1.9.12 con Spring 3.2.2.)@JsonSerialize
sintaxis a@JsonInclude
. La sintaxis anterior está en desuso.Con Jackson> 1.9.11 y <2.x use la
@JsonSerialize
anotación para hacer eso:@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
fuente
@JsonSerialize(using = FooSerializer.class, include = JsonSerialize.Inclusion.NON_NULL)
no funciona los valores anulables se serializan.Solo para ampliar las otras respuestas: si necesita controlar la omisión de valores nulos por campo, anote el campo en cuestión (o, alternativamente, anote el 'captador' del campo).
ejemplo: aquí solo
fieldOne
se omitirá de json si es nulo.fieldTwo
siempre se incluirá independientemente de si es nulo.Para omitir todos los valores nulos en la clase por defecto, anote la clase. Las anotaciones por campo / captador todavía se pueden usar para anular este valor predeterminado si es necesario.
ejemplo: aquí
fieldOne
yfieldTwo
se omitirá de json si son nulos, respectivamente, porque este es el valor predeterminado establecido por la anotación de clase.fieldThree
sin embargo, anulará el valor predeterminado y siempre se incluirá, debido a la anotación en el campo.ACTUALIZAR
Lo anterior es para Jackson 2 . Para versiones anteriores de Jackson necesitas usar:
en vez de
Si esta actualización es útil, vota la respuesta de ZiglioUK a continuación, ¡señaló la nueva anotación Jackson 2 mucho antes de que actualizara mi respuesta para usarla!
fuente
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
está en desusoEn Jackson 2.x, use:
fuente
com.fasterxml.jackson.annotation
: Jackson 1.x teníaorg.codehaus.jackson.annoation
Puede usar la siguiente configuración del mapeador:
Desde 2.5 puedes usar:
fuente
getSerializationConfig()
dice:Note that since instances are immutable, you can NOT change settings by accessing an instance and calling methods: this will simply create new instance of config object.
mapper.setSerializationInclusion(Include.NON_NULL);
Puedes configurar
application.properties
:o
application.yaml
:http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
fuente
en mi caso
Lo hizo funcionar.
fuente
{ }
nulo, que transfiere sin sentido un idioma de Java al consumidor. lo mismo con AtomicReference: al consumidor no le importa cómo el desarrollador eligió hacer cumplir la seguridad de los hilos en la representación interna de la respuesta.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.fuente
JsonInclude.Include.NON_EMPTY
- es suficiente ya que cubre el caso NOT_NULLSi desea agregar esta regla a todos los modelos en Jackson 2.6+ use:
fuente
Si está en Spring Boot , puede personalizar el jackson
ObjectMapper
directamente a través de los archivos de propiedades.Ejemplo
application.yml
:Los valores posibles son:
Más: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper
fuente
Esto funcionará en Spring boot 2.0.3+ y Jackson 2.0+
fuente
@JsonInclude(JsonInclude.Include.NON_NULL)
funcionó para mí en Spring boot 2.1.2 y las anotaciones de Jackson 2.9.0Para Jackson 2.5 use:
fuente
Esto me ha estado preocupando durante bastante tiempo y finalmente encontré el problema. El problema se debió a una importación incorrecta. Anteriormente había estado usando
Que había quedado en desuso. Simplemente reemplace la importación por
y úsalo como
fuente
Configuración global si usa Spring
fuente
public Jackson2ObjectMapperBuilder serializationInclusion(JsonInclude.Include serializationInclusion) { this.serializationInclusion = serializationInclusion; return this; }
; Uno debería usar el radio de enumeración de inclusión mayor. por ejemplo, NON_ABSENT incluye NON_NULL y NON_EMPTY incluye ambos. Por lo tanto, solo debería serbuilder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
JacksonInclude docSi está intentando serializar una lista de objetos y uno de ellos es nulo, terminará incluyendo el elemento nulo en el JSON incluso con
resultará en:
para obtener esto:
uno puede hacer algo como:
SUGERENCIA: si está utilizando DropWizard, puede recuperar el
ObjectMapper
que Jersey está utilizandoenvironment.getObjectMapper()
fuente
Tenemos muchas respuestas a esta pregunta. Esta respuesta puede ser útil en algunos escenarios. Si desea ignorar los valores nulos, puede usar NOT_NULL en el nivel de clase. como a continuación
Algunas veces es posible que deba ignorar los valores vacíos, como haber inicializado el arrayList, pero no hay elementos en esa lista. En ese momento, use la anotación NOT_EMPTY para ignorar esos campos de valores vacíos
fuente
Jackson 2.x + uso
fuente
.withSerializationInclusion(JsonInclude.Include.NON_NULL)
en lugar correcto?getSerializationConfig()
dice:Note that since instances are immutable, you can NOT change settings by accessing an instance and calling methods: this will simply create new instance of config object.
Además, debe cambiar su enfoque al usar Map myVariable como se describe en la documentación para eliminar los valores nulos:
fuente
Caso uno
Caso dos
Si
someString
es nulo, se ignorará en ambos casos. SisomeString
es "" solo se ignorará en el caso dos.Lo mismo para
List = null
oList.size() = 0
fuente