Jackson - Lavorare con mappe e valori nulli

1. Panoramica

In questo rapido articolo, esamineremo un caso d'uso più avanzato dell'uso di Jackson, lavorando con mappe che contengono valori nulli o chiavi nulle .

2. Ignora i valori nulli in una mappa

Jackson ha un modo semplice ma utile per controllare globalmente cosa succede ai valori nulli quando una mappa viene serializzata:

ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(Include.NON_NULL);

Ora qualsiasi valore nullo nell'oggetto Map serializzato tramite questo mapper verrà ignorato:

@Test public void givenIgnoringNullValuesInMap_whenWritingMapObjectWithNullValue_thenIgnored() throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(Include.NON_NULL); MyDto dtoObject1 = new MyDto(); Map dtoMap = new HashMap(); dtoMap.put("dtoObject1", dtoObject1); dtoMap.put("dtoObject2", null); String dtoMapAsString = mapper.writeValueAsString(dtoMap); assertThat(dtoMapAsString, containsString("dtoObject1")); assertThat(dtoMapAsString, not(containsString("dtoObject2"))); }

3. Serializzazione di una mappa con una chiave nulla

Per impostazione predefinita, Jackson non consente la serializzazione di una mappa con una chiave nulla . Se provi a scrivere una mappa di questo tipo, otterrai la seguente eccezione:

c.f.j.c.JsonGenerationException: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?) at c.f.j.d.s.i.FailingSerializer.serialize(FailingSerializer.java:36)

La libreria è tuttavia sufficientemente flessibile da poter definire un serializzatore di chiavi null personalizzato e sovrascrivere il comportamento predefinito:

class MyDtoNullKeySerializer extends StdSerializer { public MyDtoNullKeySerializer() { this(null); } public MyDtoNullKeySerializer(Class t) { super(t); } @Override public void serialize(Object nullKey, JsonGenerator jsonGenerator, SerializerProvider unused) throws IOException, JsonProcessingException { jsonGenerator.writeFieldName(""); } }

Ora la mappa con la chiave nulla funzionerà perfettamente e la chiave nulla verrà scritta come una stringa vuota:

@Test public void givenAllowingMapObjectWithNullKey_whenWriting_thenCorrect() throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); mapper.getSerializerProvider().setNullKeySerializer(new MyDtoNullKeySerializer()); MyDto dtoObject = new MyDto(); dtoObject.setStringValue("dtoObjectString"); Map dtoMap = new HashMap(); dtoMap.put(null, dtoObject); String dtoMapAsString = mapper.writeValueAsString(dtoMap); assertThat(dtoMapAsString, containsString("\"\"")); assertThat(dtoMapAsString, containsString("dtoObjectString")); }

4. Ignora i campi nulli

Oltre a Maps, Jackson fornisce molta configurazione e flessibilità per ignorare / lavorare con campi nulli in generale. Puoi dare un'occhiata a questo tutorial per vedere esattamente come funziona.

5. conclusione

Serializzare un oggetto Map è abbastanza comune che abbiamo bisogno di una libreria in grado di gestire bene le sfumature del processo di serializzazione. Jackson fornisce alcune utili opzioni di personalizzazione per aiutarti a modellare abbastanza bene l'output di questo processo di serializzazione.

Fornisce inoltre molti modi solidi per lavorare con le raccolte in un senso più generale.

L'implementazione di tutti questi esempi e frammenti di codice può essere trovata su GitHub : questo è un progetto basato su Maven, quindi dovrebbe essere facile da importare ed eseguire così com'è.