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:
- El mapa puede tener muchos valores nulos y claves nulas, y no quiero que los nulos se serialicen.
- 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
}
}