繁体   English   中英

具有JsonSubTypes和JsonTypeInfo的FasterXML Jackson的JSON多态性

[英]FasterXML Jackson's JSON polymorphism with JsonSubTypes and JsonTypeInfo

对于FasterXML的Jackon JSON开发人员来说,这是一个普遍的问题。 当我遇到类似的POJO时,我遇到了它:

package net.package.dogs.retrievers

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "family")
@JsonSubTypes(value = {
    @JsonSubTypes.Type(value = LabradorRetriever.class),
    @JsonSubTypes.Type(value = GoldenRetriever.class)
})
public abstract class Retriever {
    private String name;
    private Color color;

    public Retriever() {}

    public Retriever(String name, Color color) {
        this.name = name;
        this.color = color;
    }

    public String bark() {
        return "You can't hear me but I'm barking"; 
    }
}
package net.package.dogs.retrievers

public class LabradorRetriever extends Retriever {
    public LabradorRetriever() {
        super();
    }

    public LabradorRetriever(String name, Color color) {
        super(name, color);
    }

    public String bark() {
        return "Ruff! Ruff!";
    }

    public String fetchDucks() {
        return "ufff...";
    }
}
package net.package.dogs.retrievers

public class GoldenRetriever extends Retriever {

    public GoldenRetriever() {
        super();
    }

    public GoldenRetriever(String name, Color color) {
        super(name, color);
    }

    public String bark() {
        return "Wruuff! Wruff!";
    }
}
public enum Color {
    YELLOW,
    CHOCOLATE,
    BLACK
}

此类与以下JSON消息匹配...

{
    "family" : "net.package.dogs.retrievers.GoldenRetriever",
    "name" : "Goldie",
    "color" : "YELLOW"
}
{
    "family" : "net.package.dogs.retrievers.LabradorRetriever",
    "name" : "Cookie",
    "color" : "CHOCOLATE"
}

但是,我希望有一个不同的“种族”,如下所示。

{
    "family" : "GOLDEN_RETRIEVER",
    "name" : "Goldie",
    "color" : "YELLOW"
}
{
    "family" : "LABRADOR_RETRIEVER",
    "name" : "Cookie",
    "color" : "CHOCOLATE"
}

我应如何填充JsonTypeInfoJsonSubTypes以匹配此先前的JSON消息?

这是您可以完成此操作的一种方法:

  1. @JsonTypeInfo更改为使用JsonTypeInfo.Id.NAME

     @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, ... 
  2. 添加@JsonTypeName以进行名称解析:

     @JsonTypeName("LABRADOR_RETRIEVER") public class LabradorRetriever extends Retriever { 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM