在使用Jackson进行反序列化时,如何从父对象中重用值来构造子对象?

3

我有两个类拥有一个冗余的共享属性:

class Parent {
   int version;
   Child child;
}

class Child {
   int version;
   String name;
}
Child 中的 version 字段仅是 Parent 自己字段的一个本地副本,因此在 JSON 中表示为:
{
    "version": 2,
    "child": {
        "name": "john"
    }
}

我希望将此JSON有效载荷反序列化为相应的Parent对象,且该对象具有parent.child.version == 2(该值从父对象复制)。我该如何实现?
我考虑使用@JacksonInjectversion传递给Child,但这需要在反序列化父对象时填充注入的值。我找不到任何方法来在自定义反序列化器中注册注入的值:DeserializationContextfindInjectableValue方法只允许我们查找此类值。

你的JSON不完整。请编辑问题。 - Gurwinder Singh
@Luiggi - 在此之前,它是不完整的。只有开头的 { 括号在那里。 - Gurwinder Singh
1个回答

1

这不是一个完全针对Jackson的解决方案,但可能是最简单的方法:创建一个PreChild类,其属性与JSON有效载荷匹配,然后在Parent的构造函数中将PreChild转换为Child

class PreChild {
   String name;

   public Child withVersion(int version) {
        return Child(version, name);
   }
}
class Parent {
   int version;
   Child child;

   @JsonCreator
   Parent(
       @JsonProperty("version") int version,
       @JsonProperty("child") PreChild preChild) {
       this.version = version;
       this.child = preChild.withVersion(version);
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接