Автор оригинала: Eugen Paraschiv.
1. Обзор
В этой краткой статье мы рассмотрим более продвинутый вариант использования Jackson-работа с Картами , которые содержат нулевые значения или нулевые ключи .
2. Игнорируйте значения Null на карте
У Джексона есть простой, но полезный способ глобального управления тем, что происходит с нулевыми значениями при сериализации карты:
ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(Include.NON_NULL);
Теперь любое нулевое значение в объекте карты, сериализованном с помощью этого картографа, будет игнорироваться:
@Test public void givenIgnoringNullValuesInMap_whenWritingMapObjectWithNullValue_thenIgnored() throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(Include.NON_NULL); MyDto dtoObject1 = new MyDto(); MapdtoMap = 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. Сериализация карты С Нулевым ключом
По умолчанию Джексон не разрешает сериализацию карты с нулевым ключом . Если вы попытаетесь написать такую карту, вы получите следующее исключение:
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)
Однако библиотека достаточно гибка, чтобы вы могли определить пользовательский сериализатор нулевых ключей и переопределить поведение по умолчанию:
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"); MapdtoMap = new HashMap (); dtoMap.put(null, dtoObject); String dtoMapAsString = mapper.writeValueAsString(dtoMap); assertThat(dtoMapAsString, containsString("\"\"")); assertThat(dtoMapAsString, containsString("dtoObjectString")); }
4. Игнорируйте Пустые Поля
Помимо карт, Джексон обеспечивает большую конфигурацию и гибкость для игнорирования/работы с null полями в целом. Вы можете проверить этот учебник , чтобы увидеть, как именно это работает.
5. Заключение
Сериализация объекта карты достаточно распространена, поэтому нам нужна библиотека, способная хорошо справляться с нюансами процесса сериализации. Джексон предоставляет несколько удобных вариантов настройки, которые помогут вам довольно хорошо сформировать выходные данные этого процесса сериализации.
Он также предоставляет множество надежных способов работы с коллекциями в более общем смысле.
Реализацию всех этих примеров и фрагментов кода можно найти в на GitHub – это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.