update insertar guardar fecha enviar desde campo asignar java json jackson

java - insertar - Cómo evitar que valores nulos dentro de un mapa y campos nulos dentro de un bean sean serializados a través de Jackson



insertar null en campo datetime (4)

Tengo un Map<String,Foo> foosMap que quiero serializar a través de Jackson. Ahora quiero seguir dos configuraciones en el proceso de serialización:

  1. El mapa puede tener muchos valores nulos y claves nulas, y no quiero que los nulos se serialicen.
  2. Para todos los Foos que están siendo serializados, no quiero serializar objetos nulos referenciados dentro de Foo.

Cuál es la mejor manera de lograr esto ? Estoy usando jackson-core1.9 y jackson-mapper1.9 jar en mi proyecto.


La respuesta parece ser un poco vieja, lo que hice fue usar este mapeador para convertir un MAP

ObjectMapper mapper = new ObjectMapper().configure(SerializationConfig.Feature.WRITE_NULL_MAP_VALUES, false);

un Map simple:

Map<String, Object> user = new HashMap<String,Object>(); user.put( "id", teklif.getAccount().getId() ); user.put( "fname", teklif.getAccount().getFname()); user.put( "lname", teklif.getAccount().getLname()); user.put( "email", teklif.getAccount().getEmail()); user.put( "test", null);

Úselo así por ejemplo:

String json = mapper.writeValueAsString(user);


Para las versiones de Jackson <2.0 use esta anotación en la clase que se serializa:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)


Si es razonable alterar la estructura de datos del Map original que se serializará para representar mejor el valor real que se desea serializar, probablemente sea un enfoque decente, lo que posiblemente reduciría la cantidad de configuración de Jackson necesaria. Por ejemplo, solo elimine las entradas de la tecla null , si es posible, antes de llamar a Jackson. Eso dijo ...

Para suprimir la serialización de entradas de Map con valores nulos:

Antes de Jackson 2.9

aún puede hacer uso de WRITE_NULL_MAP_VALUES , pero tenga en cuenta que se movió a SerializationFeature :

mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);

Desde Jackson 2.9

WRITE_NULL_MAP_VALUES está en desuso, puede usar el siguiente equivalente:

mapper.setDefaultPropertyInclusion( JsonInclude.Value.construct(Include.ALWAYS, Include.NON_NULL))

Para suprimir las propiedades de serialización con valores nulos, puede configurar ObjectMapper directamente o utilizar la anotación @JsonInclude :

mapper.setSerializationInclusion(Include.NON_NULL);

o:

@JsonInclude(Include.NON_NULL) class Foo { public String bar; Foo(String bar) { this.bar = bar; } }

Para manejar las claves de Map nulas, es necesaria una serialización personalizada, lo mejor que entiendo.

Un enfoque simple para serializar claves null como cadenas vacías (incluyendo ejemplos completos de las dos configuraciones mencionadas anteriormente):

import java.io.IOException; import java.util.HashMap; import java.util.Map; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializerProvider; public class JacksonFoo { public static void main(String[] args) throws Exception { Map<String, Foo> foos = new HashMap<String, Foo>(); foos.put("foo1", new Foo("foo1")); foos.put("foo2", new Foo(null)); foos.put("foo3", null); foos.put(null, new Foo("foo4")); // System.out.println(new ObjectMapper().writeValueAsString(foos)); // Exception: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?) ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); mapper.setSerializationInclusion(Include.NON_NULL); mapper.getSerializerProvider().setNullKeySerializer(new MyNullKeySerializer()); System.out.println(mapper.writeValueAsString(foos)); // output: // {"":{"bar":"foo4"},"foo2":{},"foo1":{"bar":"foo1"}} } } class MyNullKeySerializer extends JsonSerializer<Object> { @Override public void serialize(Object nullKey, JsonGenerator jsonGenerator, SerializerProvider unused) throws IOException, JsonProcessingException { jsonGenerator.writeFieldName(""); } } class Foo { public String bar; Foo(String bar) { this.bar = bar; } }

Para suprimir la serialización de entradas de Map con claves null , sería necesario un procesamiento de serialización personalizado adicional.


mi solución, espero ayuda
ObjectMapper personalizado y config para spring xml (registro de mensajes conveters)

public class PyResponseConfigObjectMapper extends ObjectMapper { public PyResponseConfigObjectMapper() { disable(SerializationFeature.WRITE_NULL_MAP_VALUES); //map no_null setSerializationInclusion(JsonInclude.Include.NON_NULL); // bean no_null }

}