当你想Optional用Java中的Jackson进行序列化时,你必须注册该模块Jdk8Module。这样,您要么获得包含的值,要么获得null.
现在,如果您还设置了序列化功能JsonInclude.Include.NON_NULL,我最初希望这会从 JSON 输出中省略空引用和空选项,因为它们都null在序列化 JSON 中输出 - 但实际上它只省略了空引用。为了也省略空选项,我找到了两个选项:
设置configureAbsentsAsNulls(true)在Jdk8Module. 根据文档:
启用意味着Optional.empty()值像Java nulls一样处理(wrt过滤序列化);禁用它们仅被视为“空”值,但不像本机 Java null。该值的推荐设置为 false。为了与其他“可选”值(如 Guava 可选)的旧版本兼容,可以将其设置为“true”。为了向后兼容,默认值为 false。
设置setSerializationInclusion(JsonInclude.Include.NON_ABSENT),ObjectMapper它将执行所有NON_NULL操作,但根据文档也会省略:
引用类型的“不存在”值(例如 Java 8 可选,或 {link java.utl.concurrent.atomic.AtomicReference});也就是说,不遵循非空值的东西。此选项主要用于与“可选”(Java 8、Guava)一起使用。
现在我试图理解上面选项 1 和 2 之间的含义和实际差异,因为两者给出相同的结果 - 空引用和空选项都没有序列化。
首选方案是什么?这两个选项在实践中是否相同?