Jackson - Travailler avec des cartes et des valeurs nulles

1. Vue d'ensemble

Dans cet article rapide, nous allons examiner un cas d'utilisation plus avancé de l'utilisation de Jackson - travailler avec des cartes contenant des valeurs nulles ou des clés nulles .

2. Ignorer les valeurs nulles dans une mappe

Jackson a un moyen simple mais utile de contrôler globalement ce qui arrive aux valeurs nulles lorsqu'une carte est sérialisée:

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

Désormais, toute valeur nulle dans l'objet Map sérialisé via ce mappeur sera ignorée:

@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. Sérialisation d'une carte avec une clé nulle

Par défaut, Jackson n'autorise pas la sérialisation d'une carte avec une clé nulle . Si vous essayez d'écrire une telle carte, vous obtiendrez l'exception suivante:

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 bibliothèque est cependant suffisamment flexible pour que vous puissiez définir un sérialiseur de clé null personnalisé et remplacer le comportement par défaut:

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(""); } }

Maintenant, la carte avec la clé nulle fonctionnera très bien - et la clé nulle sera écrite comme une chaîne vide:

@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. Ignorer les champs nuls

Outre Maps, Jackson fournit beaucoup de configuration et de flexibilité pour ignorer / travailler avec les champs nuls en général. Vous pouvez consulter ce didacticiel pour voir exactement comment cela fonctionne.

5. Conclusion

La sérialisation d'un objet Map est suffisamment courante pour que nous ayons besoin d'une bibliothèque capable de bien gérer les nuances du processus de sérialisation. Jackson fournit quelques options de personnalisation pratiques pour vous aider à bien façonner la sortie de ce processus de sérialisation.

Il fournit également de nombreuses façons solides de travailler avec des collections dans un sens plus général.

L'implémentation de tous ces exemples et extraits de code peut être trouvée dans over sur GitHub - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.