使用 Jackson 序列化可选:NON_ABSENT 与 configureAbsentsAsNulls 和 NON_NULL

tro*_*dbt 5 null serialization json jackson option-type

当你想Optional用Java中的Jackson进行序列化时,你必须注册该模块Jdk8Module。这样,您要么获得包含的值,要么获得null.

现在,如果您还设置了序列化功能JsonInclude.Include.NON_NULL,我最初希望这会从 JSON 输出中省略空引用和空选项,因为它们都null在序列化 JSON 中输出 - 但实际上它只省略了空引用。为了也省略空选项,我找到了两个选项:

  1. 设置configureAbsentsAsNulls(true)Jdk8Module. 根据文档

    启用意味着Optional.empty()值像Java nulls一样处理(wrt过滤序列化);禁用它们仅被视为“空”值,但不像本机 Java null。该值的推荐设置为 false。为了与其他“可选”值(如 Guava 可选)的旧版本兼容,可以将其设置为“true”。为了向后兼容,默认值为 false。

  2. 设置setSerializationInclusion(JsonInclude.Include.NON_ABSENT)ObjectMapper它将执行所有NON_NULL操作,但根据文档也会省略:

    引用类型的“不存在”值(例如 Java 8 可选,或 {link java.utl.concurrent.atomic.AtomicReference});也就是说,不遵循非空值的东西。此选项主要用于与“可选”(Java 8、Guava)一起使用。

现在我试图理解上面选项 1 和 2 之间的含义和实际差异,因为两者给出相同的结果 - 空引用和空选项都没有序列化。

首选方案是什么?这两个选项在实践中是否相同?

kir*_*uku 1

configureAbsentsAsNulls(true)自版本 发布以来,已弃用的使用2.13。该方法的弃用消息显示:

自 2.13 起,没有替代品,将从 Jackson 3.0 中删除(当可选类型将成为核心数据绑定的一部分时)

完整的 Javadoc 提供了更多细节:

可用于更改配置设置的配置方法 _cfgHandleAbsentAsNull:启用意味着Optional.empty()像 Java null 一样处理值(对序列化进行过滤);禁用它们仅被视为“空”值,但不像本机 Java null。该值的推荐设置为false。为了与其他“可选”值(如 Guava 可选)的旧版本兼容,可以将其设置为“true”。默认值是false为了向后兼容。

NON_ABSENT请注意,在大多数情况下,仅使用包含标准来过滤掉不存在的选项更有意义;此设置对于 2.6 版之前的旧用例最有用。