【问题标题】:Ignore Jackson polymorphic type mapping忽略 Jackson 多态类型映射
【发布时间】:2014-08-23 16:53:13
【问题描述】:

我使用@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 包含我想忽略的类型时,就会出现问题。例如,如果我有一个我不想反序列化为对象的新类型“猪”:

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

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

无法将类型 id 'pig' 解析为 [simple type, class 动物]

我该如何解决这个问题,以便仅映射“狗”和“猫”类型的动物,而忽略其他所有内容?

【问题讨论】:

  • 你的问题解决了吗?

标签: jackson


【解决方案1】:

您可以通过将JsonTypeInfo.defaultImpl 注释属性设置为java.lang.VoidNoClass 来避免异常,具体取决于您使用的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 中的一个错误,但很容易容忍。

【讨论】:

  • 我实际上使用了自定义反序列化器路由,但如果您只想忽略某些类型,这种方式也可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2019-12-05
  • 2013-12-26
  • 2015-07-05
  • 1970-01-01
  • 2013-06-21
  • 2021-11-22
相关资源
最近更新 更多