Jackson - Trabalhando com mapas e nulos

Jackson - Trabalhando com mapas e nulos

1. Visão geral

Neste artigo rápido, veremos um caso de uso mais avançado de usarJackson – working with Maps that contain null values or null keys.

2. Ignorar valores nulos em um mapa

Jackson tem uma maneira simples, mas útil, de controlar globalmente o que acontece com valores nulos quando um mapa é serializado:

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

Agora, qualquer valor nulo no objeto Map serializado por meio desse mapeador será ignorado:

@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. Serializando um mapa com uma chave nula

Por padrão,Jackson doesn’t allow the serialization of a Map with a null key. Se você tentar escrever um mapa assim, obterá a seguinte exceção:

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)

A biblioteca, entretanto, é flexível o suficiente para que você possa definira custom, null key serializere substituir o comportamento padrão:

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


Agora o mapa com a chave nula funcionará perfeitamente - e a chave nula será gravada como uma String vazia:

@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. Ignorar campos nulos

Além do Maps, Jackson oferece muita configuração e flexibilidade para ignorar / trabalhar com camposnull em geral. Você pode verificarthis tutorial para ver exatamente como isso funciona.

5. Conclusão

Serializar um objeto Map é comum o suficiente para que precisamos de uma biblioteca que seja capaz de lidar bem com as nuances do processo de serialização. Jackson fornece algumas opções úteis de personalização para ajudá-lo a moldar muito bem a saída desse processo de serialização.

Ele também fornecea lot of solid ways to work with collections em um sentido mais geral.

A implementação de todos esses exemplos e trechos de códigocan be found in over on GitHub - este é um projeto baseado em Maven, portanto, deve ser fácil de importar e executar como está.