我正在使用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主体中没有类型的附加字段)。