0

これは、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"
}

この前の JSON メッセージをどのように入力JsonTypeInfoして一致させる必要がありますか?JsonSubTypes

4

1 に答える 1

1

これを実現する方法の 1 つを次に示します。

  1. @JsonTypeInfoを使用するように変更しますJsonTypeInfo.Id.NAME

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, ...
    
  2. @JsonTypeName名前解決のために追加:

    @JsonTypeName("LABRADOR_RETRIEVER")
    public class LabradorRetriever extends Retriever {
    
于 2015-04-18T06:39:10.060 に答える