java - 使用 Jackson 反序列化 JSON 时的隐式默认值

标签 java json jackson deserialization

在反序列化各种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/618https://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/

相关文章:

java - 来自单独类的 JTextField

java - 使用MVC动态填充jsp中的选择选项

java - 使用 GSON 不解析字段,只保留它与 json 原始字符串

json - 从 JSON 中提取字段

javascript - 尝试将 json 响应放入表中 - 未定义错误

java - 如何通过 Jackson 2 JsonNode 树遍历 JSON?

java - 如何使用java判断一天是否过去

java - 如何定义类来使用 Gson 解析此 JSON?

java - Jackson 使用解包根解析 json,但无法设置 @JsonRootName

java - 映射到 JsonProperty 时对 JSON 创建实践感到困惑