我正在使用Jackson尝试反序列化此数据结构:
{
"type": "foo", // or "bar", "baz", etc
"name": "number 1",
"params": {
// parameters specific to type 'foo'
}
}
我知道我可以使用自定义反序列化器,但是我想知道是否可以仅使用
@JsonType*
注释家族来做到这一点?现在,我的班级设置如下:
public class TopLevelObject {
String type;
String name;
AbstractParams params;
}
public class FooParams extends AbstractParams {
String one;
String two;
}
public class BarParams extends AbstractParams {
String three;
String four;
}
abstract public class AbstractParams {
}
如果将属性移到
@JsonTypeInfo
类中,则可以在type
属性上使用AbstractParams
,但是在将type
属性保留在TopLevelObject
中的同时,似乎无法获得相同的结果。有任何想法吗?
最佳答案
可以使用@JsonTypeInfo(use = Id.NAME, include = As.EXTERNAL_PROPERTY)
。但是As.EXTERNAL_PROPERTY
只能用于属性。 More info。
因此,您必须在@JsonTypeInfo
类的AbstractParams
字段/设置者上放置TopLevelObject
批注
class TopLevelObject {
public String type;
public String name;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include= JsonTypeInfo.As.EXTERNAL_PROPERTY,
property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = FooParams.class, name = "foo"),
@JsonSubTypes.Type(value = BarParams.class, name = "bar")})
public AbstractParams params;
}