【问题标题】:FasterXML Jackson's JSON polymorphism with JsonSubTypes and JsonTypeInfoFasterXML Jackson 的 JSON 多态性与 JsonSubTypes 和 JsonTypeInfo
【发布时间】:2015-04-17 19:33:35
【问题描述】:

这是 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 消息?

【问题讨论】:

    标签: java json polymorphism jackson fasterxml


    【解决方案1】:

    这是您可以完成此任务的一种方法:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多