属性的杰克逊继承

时间:2019-03-22 14:25:05

标签: java json inheritance jackson jackson-databind

是否可以通过jackson反序列化给定的JSON字符串,从而使属性 attr 的类型为 Sub 而不是 Base ? / p>

Json:

{
    "x": "yz",
    "attr": {
        "b": "hello",
        "c": "world"
    }
}

Java类:

public class ExampleClass {
  String x;
  Base attr;

  //getter, setter
}


public class Base{  
  String a; 

  //getter, setter 
}

public class Sub extends Base{  
  String b;
  String c;

  //getter, setter
}

1 个答案:

答案 0 :(得分:0)

选项1:固定实施

假设您有权访问Base的实现,则可以对其进行注释,以始终使用JsonDeserialize.as()将其反序列化为Sub实现。

@JsonDeserialize(as = Sub.class)
class Base {
    //etc.
}

选择2:基于内容的实施

使用一个字段来确定反序列化为哪个实现。有关详细信息,请参见相关答案:Deserializing polymorphic types with Jackson

选项3:无法访问Base

这是一种无需访问Base类实现即可实现选项1和2之类的行为的方法。假设我们要使用本地Jackson而不是自定义解串器来实现此目的,我们使用Mix-ins。通过使用混入,您可以通过在不同模型中的匹配签名上定义注释来将它们添加到未定义的模型中。

定义混入以产生上述选项1:

@JsonDeserialize(as = Sub.class)
class BaseMixIn { }

要使用BaseMixIn,必须修改ObjectMapper实例:

ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(Base.class, BaseMixIn.class);

只需像其他ObjectMapper一样使用mapper