Если вы хотите сериализовать Optional
с Джексоном в Java, вы должны зарегистрировать модуль Jdk8Module
. Таким образом, вы либо получите содержащее значение, либо null
.
Теперь, если вы также установите функцию сериализации JsonInclude.Include.NON_NULL
, я изначально ожидал, что это исключит как нулевые ссылки, так и пустые опции из JSON выводить, поскольку они оба выводят null
в сериализованном JSON - но на самом деле он только пропускает нулевые ссылки. Чтобы также опустить пустые опции, я нашел две опции:
Установить configureAbsentsAsNulls(true)
на Jdk8Module
. В соответствии с разрешением docs :
означает, что значения Optional.empty () обрабатываются как Java null (фильтрация при сериализации); отключение того, что они обрабатываются только как «пустые» значения, но не как нуль Java. Рекомендуемая настройка для этого значения - ложь. Для совместимости со старыми версиями других «необязательных» значений (таких как необязательные параметры Guava), его можно установить в «true» По умолчанию установлено значение false для обратной совместимости.
Установить setSerializationInclusion(JsonInclude.Include.NON_ABSENT)
на ObjectMapper
, что будет делать все, что NON_NULL
делает, но в соответствии с документами также пропустит:
«отсутствующее» значение ссылочного типа (например, Java 8 Необязательно или {link java .utl.concurrent.atomi c .AtomicReference }); то есть то, что не будет относиться к ненулевому значению. Эта опция в основном используется для работы с «Optional» (Java 8, Guava).
Теперь я пытаюсь понять последствия и практические различия между опциями 1 и 2 выше, поскольку оба дают один и тот же результат - что и нулевые ссылки, и пустые необязательные параметры не сериализуются.
Какой предпочтительный вариант? И идентичны ли эти два варианта на практике?