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

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

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

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

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

Он также предоставляетa lot of solid ways to work with collections в более общем смысле.

Реализация всех этих примеров и фрагментов кодаcan be found in over on GitHub - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.