JSON、泽西岛和杰克逊中的多态性

2022-09-04 03:25:37

Jackson with Jersey 是否支持 JSON 上的多态类?

例如,假设我有一个 Parent 类和一个从它继承的 Child 类。而且,假设我想使用JSON通过HTTP发送和接收父级和子级。

public class Parent {
...
}

public class Child extends Parent {
...
}

我考虑过这种实现:

@Consumes({ "application/json" }) // This method supposed to get a parent, enhance it and return it back
    public @ResponseBody 
    Parent enhance(@RequestBody Parent parent) {
    ...
    }

问:如果我给这个函数(当然是通过JSON)一个子对象,它能工作吗?是否还会序列化子项的额外成员字段?基本上,我想知道这些框架是否支持多态消费和响应。

顺便说一句,我正在与Spring MVC合作。


答案 1

杰克逊确实支持多态性,

在子类中,用名称注释:

 @JsonTypeName("Child_Class")
 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "objectType")
 public class Child extends Parent{
 ....
 }

在父级中,您可以指定子类型:

@JsonSubTypes({ @JsonSubTypes.Type(value = Child.class), @JsonSubTypes.Type(value = SomeOther.class)}) 
public class Parent {
    ....
}

答案 2