Jackson多态支持

背景

Json转为类时,结构并不完全一致,是由几个子类继承父类而成,直接使用父类的Class没法直接将json转为对应的子类。

使用注解

public class Zoo {
    public Animal animal;
  }

  static class Animal { // All animals have names, for our demo purposes...
    public String name;
    protected Animal() { }
  }

  static class Dog extends Animal {
    public double barkVolume; // in decibels
    public Dog() { }
  }

  static class Cat extends Animal {
    boolean likesCream;
    public int lives;
    public Cat() { }
  }

在父类上加上如下注解

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")

然后将子类用@JsonSubTypes来注册

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")  
@JsonSubTypes({  
  @JsonSubTypes.Type(name="dog",value=Dog.class),  
  @JsonSubTypes.Type(name="cat",value=Cat.class),  
  })  
class Animal { }  

要注意的是所有注解都是在父类的,子类不需改动。

解析的时候用

objectMapper.readValue(json, Animal.class);

即可。

不使用注解

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerSubtypes(Animal.class);
        mapper.registerSubtypes(new NamedType(Dog.class,"dog"));
        mapper.registerSubtypes(new NamedType(Cat.class,"cat"));

这里需要注意的是父类也需要用registerSubtypes注册,且依然需要加上@JsonTypeInfo的注解。

推荐阅读更多精彩内容