【发布时间】:2015-04-28 20:03:59
【问题描述】:
在反序列化各种 JSON 消息时,我想为某种类型的属性提供一个默认值。 generally suggested 可以简单地指定 Class 中的值,但如果您必须跨多个 Class 执行此操作,则很容易出错。您可能会忘记一个并以null 而不是默认值结束。我的意图是将Optional<T> 的每个属性设置为Optional.absent。由于null 正是Optional 试图消除的东西,因此与杰克逊一起使用它们已被证明是令人沮丧的。
Jackson 允许您自定义反序列化过程的大多数功能都集中在作为输入的 JSON 上,而不是围绕实例化您要反序列化的对象的过程。我似乎最接近通用解决方案的是构建自己的ValueInstantiator,但我还有两个问题:
- 如何让它只将
Optional实例化为absent而不会干扰其余的实例化过程? - 如何将最终结果连接到我的
ObjectMapper?
更新:我想澄清一下,我正在寻找的解决方案不涉及修改包含Optional'的每个类s。我反对违反 DRY 原则。每次我们将Optional's 添加到新的或现有的类时,我或我的同事都不必考虑必须做一些额外的事情。我想说,“让我反序列化的每个类中的每个可选字段,预填充Absent”,只需要一次,就可以完成。
这意味着以下内容:
- 抽象父类(需要声明)
- 自定义 Builder/Creator/JsonDeserializer(需要对每个适用的类进行注释)
- MixIn 的?我试过这个,结合反射,但我不知道如何访问我正在混入的类......
【问题讨论】:
-
您是否有任何解决方案将 Optional 值保持为空而不是 NULL。
-
@Araf 也许github.com/FasterXML/jackson-module-scala 现在会处理它?我还没有检查,请检查并在这里报告:)
标签: java json jackson deserialization