序列化可选与Jackson:NON_BSENT vs.configureAbsentsAsNulls和NON_NULL



如果要用Java中的Jackson序列化Optional,则必须注册模块Jdk8Module。通过这种方式,您可以获得包含的值或null

现在,如果您还设置了序列化特性JsonInclude.Include.NON_NULL,我最初希望它在JSON输出中同时忽略空引用和空选项,因为它们都在序列化的JSON中输出null,但实际上它只忽略了空引用。为了去掉空的选项,我找到了两个选项:

  1. Jdk8Module上设置configureAbsentsAsNulls(true)。根据文件:

    启用意味着像Java一样处理Optional.empty((值nulls(序列化时的wrt筛选(;禁用它们被视为"空"值,但不像本地Java null。推荐此值的设置为false。与旧版本兼容对于其他"可选"值(如Guava选项(,可以将其设置为"true"。对于向后兼容性,默认值为false。

  2. ObjectMapper上设置setSerializationInclusion(JsonInclude.Include.NON_ABSENT),这将完成NON_NULL所做的一切,但根据文档,也将省略:

    引用类型的"不存在"值(如Java 8 Optional或{linkjava.utl.concurrent.atomic.AtomicReference}(;也就是说不会遵从非零值。此选项主要用于使用"可选"(Java 8、Guava(。

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

首选选项是什么?这两种选择在实践中是相同的吗?

2.13版本发布以来,configureAbsentsAsNulls(true)的使用已被弃用。这种方法的反对信息说:

由于2.13,将从Jackson 3.0中删除任何替换(当可选类型将成为核心数据绑定的一部分时(

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

可用于更改配置设置的配置方法_cfgHandleAbsentAsNull:启用意味着Optional.empty()值的处理类似于Java null(序列化时的wrt过滤(;使得它们仅被视为"不合格";"空";值,但与本机Java null不同。此值的建议设置为false。为了与旧版本的其它";可选的";值(如Guava选项(,可以将其设置为"true"。默认值为false以实现向后兼容性。

请注意,在大多数情况下,只使用NON_ABSENT包含标准来筛选不存在的选项更有意义;此设置对于2.6版本之前的遗留用例非常有用。

相关内容

  • 没有找到相关文章

最新更新