Опция сериализации с Джексоном: NON_ABSENT против configureAbsentsAsNulls и NON_NULL - PullRequest
1 голос
/ 17 февраля 2020

Если вы хотите сериализовать Optional с Джексоном в Java, вы должны зарегистрировать модуль Jdk8Module. Таким образом, вы либо получите содержащее значение, либо null.

Теперь, если вы также установите функцию сериализации JsonInclude.Include.NON_NULL, я изначально ожидал, что это исключит как нулевые ссылки, так и пустые опции из JSON выводить, поскольку они оба выводят null в сериализованном JSON - но на самом деле он только пропускает нулевые ссылки. Чтобы также опустить пустые опции, я нашел две опции:

  1. Установить configureAbsentsAsNulls(true) на Jdk8Module. В соответствии с разрешением docs :

    означает, что значения Optional.empty () обрабатываются как Java null (фильтрация при сериализации); отключение того, что они обрабатываются только как «пустые» значения, но не как нуль Java. Рекомендуемая настройка для этого значения - ложь. Для совместимости со старыми версиями других «необязательных» значений (таких как необязательные параметры Guava), его можно установить в «true» По умолчанию установлено значение false для обратной совместимости.

  2. Установить setSerializationInclusion(JsonInclude.Include.NON_ABSENT) на ObjectMapper, что будет делать все, что NON_NULL делает, но в соответствии с документами также пропустит:

    «отсутствующее» значение ссылочного типа (например, Java 8 Необязательно или {link java .utl.concurrent.atomi c .AtomicReference }); то есть то, что не будет относиться к ненулевому значению. Эта опция в основном используется для работы с «Optional» (Java 8, Guava).

Теперь я пытаюсь понять последствия и практические различия между опциями 1 и 2 выше, поскольку оба дают один и тот же результат - что и нулевые ссылки, и пустые необязательные параметры не сериализуются.

Какой предпочтительный вариант? И идентичны ли эти два варианта на практике?

...