Рубрики
Без рубрики

Джексон – Работа с картами и нулями

Как сериализовать карты с нулевым ключом или нулевыми значениями с помощью Джексона.

Автор оригинала: 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();

    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. Сериализация карты С Нулевым ключом

По умолчанию Джексон не разрешает сериализацию карты с нулевым ключом . Если вы попытаетесь написать такую карту, вы получите следующее исключение:

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

Теперь карта с нулевым ключом будет работать просто отлично – и нулевой ключ будет записан в виде пустой строки:

@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 полями в целом. Вы можете проверить этот учебник , чтобы увидеть, как именно это работает.

5. Заключение

Сериализация объекта карты достаточно распространена, поэтому нам нужна библиотека, способная хорошо справляться с нюансами процесса сериализации. Джексон предоставляет несколько удобных вариантов настройки, которые помогут вам довольно хорошо сформировать выходные данные этого процесса сериализации.

Он также предоставляет множество надежных способов работы с коллекциями в более общем смысле.

Реализацию всех этих примеров и фрагментов кода можно найти в на GitHub – это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.