如果要用Java中的Jackson序列化Optional
,则必须注册模块Jdk8Module
。通过这种方式,您可以获得包含的值或null
。
现在,如果您还设置了序列化特性JsonInclude.Include.NON_NULL
,我最初希望它在JSON输出中同时忽略空引用和空选项,因为它们都在序列化的JSON中输出null
,但实际上它只忽略了空引用。为了去掉空的选项,我找到了两个选项:
-
在
Jdk8Module
上设置configureAbsentsAsNulls(true)
。根据文件:启用意味着像Java一样处理Optional.empty((值nulls(序列化时的wrt筛选(;禁用它们被视为"空"值,但不像本地Java null。推荐此值的设置为false。与旧版本兼容对于其他"可选"值(如Guava选项(,可以将其设置为"true"。对于向后兼容性,默认值为false。
-
在
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版本之前的遗留用例非常有用。