【问题标题】:Polymorphism in JSON, Jersey and JacksonJSON、Jersey 和 Jackson 中的多态性
【发布时间】:2012-01-23 19:37:13
【问题描述】:

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)一个 Child 对象,它会工作吗? Child 的额外成员字段是否也会被序列化? 基本上,我想知道这些框架是否支持多态消费和响应。

顺便说一句,我正在使用 Spring MVC。

【问题讨论】:

    标签: java json spring-mvc jersey jackson


    【解决方案1】:

    Jackson 确实支持多态性,

    在您的子类中使用名称进行注释:

     @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 {
        ....
    }
    

    【讨论】:

    • 很好的答案乌斯曼。但是,您可能希望父级而不是子级上的 @JsonTypeInfo。
    • 我们也可以这样做,在这种情况下,我们必须将名称放在 JsonSubTypes 注释中,类似于这里的答案:stackoverflow.com/questions/11798394/…
    • Jersey 2 使用 Jackson 2.X.X 这两个注释,所以我不明白为什么它不起作用。 (见fasterxml.github.io/jackson-annotations/javadoc/2.1.0/com/…
    • 如果 Parent 是第三方接口并且您不能使用 JsonSubTypes 对其进行注释怎么办?此外,将类型添加到 Json(通过 JsonTypeInfo.Id.CLASS)不是有效的解决方案,因为不应更改客户端。
    • 这不是一个好的答案,因为Jackson会在json文本中添加额外的信息,而添加的文本取决于JAVA和你的类。
    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多