Jackson Polymorphic反序列化原始类型

时间:2016-03-10 06:57:22

标签: java jackson deserialization json-deserialization

我正在使用Jackson 1.9.13并使用以下简单类来序列化/反序列化

public interface Comparable {
    //interfaces definition
}

public class ComparableString implements Comparable {
    protected String member;

    //Constructor and interface implementation etc.

    @JsonValue
    public String getString() { return this.member; }
}

//Many other comparables

public class Checker {
    private Comparable left;
    private Comparable right;
    //Getters & Setters

    public Checker(Comparable left, Comparable right) {
    }
}

现在我用两个ComparableString(其值为“A”和“B”)构建了这样一个Checker并想要序列化它,它完全正常并且给了我,例如。

{"left":"A", "right":"B"}

但现在我想反序列化它,它告诉我: 无法构造Comparable的实例,问题:抽象类型只能使用其他类型信息进行实例化。

我知道在看到Comparable时它无法确定应该使用哪种具体类型。所以我另外注释了Comparable接口,如下所示:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, defaultImpl = ComparableString.class)
@JsonSubTypes({
    @JsonSubTypes.Type(value = ComparableString.class)
    //other comparable types
})
public interface Comparable {
    //interfaces definition
}

但是现在它需要额外的类型字段来反序列化一个原语(显然它周围没有任何其他类型信息),并且序列化也发生变化,它变成这样:

{
    "left":["ComparableString","A"],
    "right":["ComparableString","B"]
}

我尝试指定use = JsonTypeInfo.Id.NONE然后又回到无法识别错误的类型。显然,没有类型信息,它无法确定用于反序列化基元的确切类型。

我的问题是:是否有可能以某种方式手动将原始反序列化映射到其中一个Comparable类?不牺牲原语的简单性(JSON主体中没有类型的附加字段)。

0 个答案:

没有答案