gpt4 book ai didi

jackson - 忽略 Jackson 多态类型映射

转载 作者:行者123 更新时间:2023-12-04 14:12:51 27 4
gpt4 key购买 nike

我正在使用 @JsonTypeInfo 和 @JsonSubTypes 来映射基于给定属性的解析子类。这是我想要解析的示例 JSON 的一个人为示例。

{ "animals": [
{ "type" : "dog", "name" : "spike" }
,{ "type" : "cat", "name" : "fluffy" }
]}

使用这个作为类
@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 { }

但是,当 JSON 包含我想忽略的类型时会出现问题。例如,如果我有一个新类型“ pig ”,我真的不想将其反序列化为对象:
{ "animals": [
{ "type" : "dog", "name" : "spike" }
,{ "type" : "cat", "name" : "fluffy" }
,{ "type" : "pig", "name" : "babe" }
]}

并尝试解析它,它会给我这个错误:

Could not resolve type id 'pig' into a subtype of [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);
}

}

输出:
[stackoverflow.JacksonUnknownType$Dog :: spike, stackoverflow.JacksonUnknownType$Cat :: fluffy, null, null, null]

请注意,生成的集合包含 3 个空项目,而不是 1 个。这可能是 Jackson 中的一个错误,但很容易容忍。

关于jackson - 忽略 Jackson 多态类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24538899/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com