在反序列化各种JSON消息时,我想为某种类型的属性提供一个默认值。是generally suggested只需在类中指定值,但如果您必须跨多个类执行此操作,这很容易出错。你可能会忘记一个并最终得到 null
而不是默认值。我的意图是设置所有属于 Optional<T>
的属性。至 Optional.absent
.自 null
到底是什么 Optional
试图消除,事实证明将它们与 jackson 一起使用是令人沮丧的。
Jackson 的大多数允许您自定义反序列化过程的功能都集中在作为输入的 JSON 上,而不是围绕实例化您要反序列化的对象的过程。我似乎最接近通用解决方案的方法是构建我自己的 ValueInstantiator
,但我还有两个问题:
- 如何让它只实例化
Optional
作为absent
但不干扰其余的实例化过程? - 如何将最终结果连接到我的
ObjectMapper
中?
更新:我想澄清一下,我正在寻找一种解决方案,不涉及修改每个包含Optional
的类。的。我反对违反 DRY 原则。每次添加 Optional
时,我或我的同事不必考虑必须做一些额外的事情。的到一个新的或现有的类。我希望能够说,“使我反序列化到的每个类中的每个可选字段都预填充 Absent
”,仅一次,然后完成它。
这意味着以下内容已出局:
- 抽象父类(需要声明)
- 自定义生成器/创建器/JsonDeserializer(需要在每个适用类上进行注释)
- MixIn 的?我试过这个,结合反射,但我不知道如何访问我正在混入的类......
最佳答案
专门针对 java.lang.Optional,Jackson 伙计们自己有一个模块:https://github.com/FasterXML/jackson-datatype-jdk8
Guava Optional 包含在 https://github.com/FasterXML/jackson-datatype-guava 中
它将为 null 创建一个 Optional.absent,但不会为缺少的 JSON 值创建一个 Optional.absent :-(。
参见 https://github.com/FasterXML/jackson-databind/issues/618和 https://github.com/FasterXML/jackson-datatype-jdk8/issues/2 .
因此,您必须像初始化集合一样初始化 Optionals。这是一个很好的做法,因此您应该能够强制执行。
private Optional<Xxx> xxx = Optional.absent();
private List<Yyy> yyys = Lists.newArrayList();
关于java - 使用 Jackson 反序列化 JSON 时的隐式默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29928841/