Jackson - Travailler avec des cartes et des valeurs nulles

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 deJackson – working with Maps that contain null values or null keys.

2. Ignorer les valeurs nulles dans une carte

Jackson dispose d'un moyen simple mais utile de contrôler globalement ce qu'il advient des valeurs nulles lorsqu'une carte est sérialisée:

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

Désormais, toute valeur NULL 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 doesn’t allow the serialization of a Map with a null key. 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éfinira custom, null key serializer 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é NULL fonctionnera parfaitement - et la clé NULL 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 champsnull en général. Vous pouvez consulterthis tutorial 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 structurer la sortie de ce processus de sérialisation.

Il fournit également desa lot of solid ways to work with collections dans un sens plus général.

L'implémentation de tous ces exemples et extraits de codecan be found in over on GitHub - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.