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
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á.