package com.andrewtarry.jackson.multiple;import com.fasterxml.jackson.annotation.JsonSubTypes;import com.fasterxml.jackson.annotation.JsonTypeInfo;@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", defaultImpl = MyInterfaceImpl.class)@JsonSubTypes({ @JsonSubTypes.Type(value = MyInterfaceImpl.class, name = "standard"), @JsonSubTypes.Type(value = MyOtherInterfaceImpl.class, name = "other")})public interface MyInterface {
String getA();
String getB();
}
复制代码
使用 @JsonSubType 注解可以支持多个实现类。在 @JsonTypeInfo 注解中指示Jackson从json中读取 type 属性,并据此选择实现类。
这个方法的好处是可以轻松地控制反序列化的实现类,但我们不会将反序列化逻辑的细节暴露到API中(译者注:存疑,使用这种方法反序列化明明就必要把实现类的类型写在JSON中,怎么能说没有暴露反序列化逻辑的细节呢?)。JSON必要像下面这样。
{
"myInterface": {
"a": "Z",
"b": "Y",
"type": "other"
}
}
复制代码
type 值只被Jackson使用,在API中使用它大概是个糟糕的方法。差异的实现类会产生差异的API调用结果,乃至大概要求用户来设置正确的实现类。
如果你的API只在应用内部使用,或者 type 属性是一个现有的、易于明确的值,那么这种方法是合适的。对于暴露到外部的API,这种方法不合适。
状况3:无法掌控接口