我正在使用@JsonTypeInfo和@JsonSubTypes来映射基于给定属性的解析子类.这是我要解析的示例JSON的一个人为举例.
{ "animals": [
{ "type" : "dog", "name" : "spike" }
,{ "type" : "cat", "name" : "fluffy" }
]}
Run Code Online (Sandbox Code Playgroud)
用这个作为班级
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME
,include = JsonTypeInfo.As.PROPERTY
,property = "type")
@JsonSubTypes({
@Type(value = Cat.class, name = "cat"),
@Type(value = Dog.class, name = "dog") })
abstract class Animal {
public String name;
{
class Dog extends Animal { }
class Cat extends Animal { }
Run Code Online (Sandbox Code Playgroud)
但是,当JSON包含我想要忽略的类型时,会出现问题.例如,如果我有一个新类型"猪",我真的不想反序列化为一个对象:
{ "animals": [
{ "type" : "dog", "name" : "spike" }
,{ "type" : "cat", "name" : "fluffy" }
,{ "type" : "pig", "name" : "babe" }
]}
Run Code Online (Sandbox Code Playgroud)
并尝试解析它,它会给我这个错误:
无法将类型ID'pig'解析为[simple type,class Animal]的子类型
我怎样才能修复它,以便我只能映射那些'狗'和'猫'类型的动物,而忽略其他一切?
您可以通过将JsonTypeInfo.defaultImpl注释设置为java.lang.Void或NoClass依赖于您正在使用的Jackson版本来避免异常.
这是一个例子:
public class JacksonUnknownType {
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type", defaultImpl = Void.class)
@JsonSubTypes({
@JsonSubTypes.Type(value = Cat.class, name = "cat"),
@JsonSubTypes.Type(value = Dog.class, name = "dog")})
public abstract static class Animal {
public String name;
@Override
public String toString() {
return getClass().getName() + " :: " + name;
}
}
public static class Dog extends Animal {
}
public static class Cat extends Animal {
}
public static final String JSON = "[\n" +
" { \"type\" : \"dog\", \"name\" : \"spike\" }\n" +
" ,{ \"type\" : \"cat\", \"name\" : \"fluffy\" }\n" +
" ,{ \"type\" : \"pig\", \"name\" : \"babe\" }\n" +
"]";
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
List<Animal> value = mapper.readValue(JSON, new TypeReference<List<Animal>>() {});
System.out.println(value);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
[stackoverflow.JacksonUnknownType$Dog :: spike, stackoverflow.JacksonUnknownType$Cat :: fluffy, null, null, null]
Run Code Online (Sandbox Code Playgroud)
请注意,生成的集合包含3个空项而不是1.这可能是杰克逊的一个错误,但它很容易容忍.
| 归档时间: |
|
| 查看次数: |
2630 次 |
| 最近记录: |