Se è ragionevole modificare la struttura di dati originale di Map
per la serializzazione per rappresentare meglio il valore effettivo che si desidera serializzare, è probabilmente un approccio decente, che potrebbe ridurre la quantità di configurazione di Jackson necessaria. Ad esempio, è sufficiente rimuovere le voci chiave null
, se possibile, prima di chiamare Jackson. Detto questo ...
Per sopprimere la serializzazione Map
voci con valori nulli:
Prima di Jackson 2.9
si può ancora fare uso di WRITE_NULL_MAP_VALUES
, ma nota che è spostato a SerializationFeature
:
mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
Dal Jackson 2.9
Il WRITE_NULL_MAP_VALUES
è deprecato, è possibile utilizzare l'equivalente di seguito:
mapper.setDefaultPropertyInclusion(
JsonInclude.Value.construct(Include.ALWAYS, Include.NON_NULL))
Per sopprimere la serializzazione di proprietà con valori nulli, è possibile configure the ObjectMapper
directly, o usufruire del @JsonInclude
della nota:
mapper.setSerializationInclusion(Include.NON_NULL);
oppure:
@JsonInclude(Include.NON_NULL)
class Foo
{
public String bar;
Foo(String bar)
{
this.bar = bar;
}
}
Per gestire nulli Map
chiavi, alcuni serializzazione personalizzata è necessario, come meglio ho capito.
Un approccio semplice per serializzare null
chiavi come stringhe vuote (compresi esempi completi delle due configurazioni precedentemente menzionati):
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;
}
}
per sopprimere la serializzazione Map
voci con null
tasti, elaborazione serializzazione ulteriormente personalizzato sarebbe necessario.
Possibile duplicato, si prega di controllare questo link: http://stackoverflow.com/questions/3140563/how-to-avoi d-null-values-serialization-in-hashmap – dbf
La mappa può avere almeno una chiave nulla – amicngh
@dbf non del tutto. per favore guarda di nuovo il titolo della domanda modificato. – Inquisitive