Джексон - Работа с картами и нулями
1. обзор
В этой быстрой статье мы рассмотрим более сложный вариант использованияJackson – working with Maps that contain null values or null keys.
2. Игнорировать нулевые значения на карте
У Джексона есть простой, но полезный способ глобального контроля того, что происходит с нулевыми значениями, когда карта сериализуется:
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
Теперь любое нулевое значение в объекте Map, сериализованном через этот преобразователь, будет игнорироваться:
@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. Сериализация карты с нулевым ключом
По умолчаниюJackson doesn’t allow the serialization of a Map with a null key. Если вы все же попытаетесь написать такую карту, вы получите следующее исключение:
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 custom, null key serializer и переопределить поведение по умолчанию:
class MyDtoNullKeySerializer extends StdSerializer
Теперь карта с нулевым ключом будет работать нормально, а нулевой ключ будет записан в виде пустой строки:
@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. Игнорировать пустые поля
Помимо Карт, Джексон предоставляет множество настроек и гибкость для игнорирования / работы с полямиnull в целом. Вы можете проверитьthis tutorial, чтобы точно узнать, как это работает.
5. Заключение
Сериализация объекта Map достаточно распространена, поэтому нам нужна библиотека, способная хорошо справляться с нюансами процесса сериализации. Джексон предоставляет несколько удобных опций настройки, которые помогут вам сформировать результаты процесса сериализации достаточно хорошо.
Он также предоставляетa lot of solid ways to work with collections в более общем смысле.
Реализация всех этих примеров и фрагментов кодаcan be found in over on GitHub - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.