jackson Sping Boot WebClient超类示例化

ohtdti5x  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(138)

我有一个WebClient,它从一个API获取一个响应,其中一个字段是许多其他子类的超类。

public class Animal {
  protected String sound;

  public Animal() {
  }

  public String getSound() {
    return sound;
  }

  public void setSound(String sound) {
    this.sound = sound;
  }
}

字符串
和几个子类(拜托,这只是一个例子)

public class Cat extends Animal {
  private String catHouseNumber;

  public Cat() {
    this.sound = "miau";
  }

  public String getCatHouseNumber() {
    return catHouseNumber;
  }

  public void setCatHouseNumber(String catHouseNumber) {
    this.catHouseNumber = catHouseNumber;
  }
}
public class Dog extends Animal {

  private String dogDesc;

  public Dog() {
    this.sound = "guau";
  }

  public String getDogDesc() {
    return dogDesc;
  }

  public void setDogDesc(String dogDesc) {
    this.dogDesc = dogDesc;
  }
}

的数据
然后,响应类如下所示

public class AnimalData {
  private int id;
  private int age;
  private int name;
  private Animal animalSpec;

  public AnimalData() {
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public int getName() {
    return name;
  }

  public void setName(int name) {
    this.name = name;
  }

  public Animal getAnimalSpec() {
    return animalSpec;
  }

  public void setAnimalSpec(Animal animalSpec) {
    this.animalSpec = animalSpec;
  }
}


当我使用webclient.get()调用时.我需要将AnimalData类中的“animalSpec”转换为Dog或Cat中的一个
我尝试自定义一个ObjectMapper,但它不工作

tzdcorbm

tzdcorbm1#

要在 AnimalData 类中处理 animalSpec 的多态解析,您需要向Jackson提供有关所使用子类类型的附加信息。这可以使用注解或自定义解析器来实现。
1.添加Jackson注解:在您的 Animal 类中,添加一个 @JsonTypeInfo annotation,其中 use = JsonTypeInfo.Id.NAMEinclude = JsonTypeInfo.As.PROPERTY。这将在JSON中包含一个类型标识符以进行分类。(在这个例子中,我假设JSON中的类型标识符名为“type”。如果在实际JSON中属性的名称不同,您可以相应地调整property属性。)

public class Animal {
// ... existing code ...

@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
protected String sound;

// ... existing code ...}

字符串
1.添加子类型注解:在每个子类(CatDog)中,添加一个带有唯一名称的 @JsonTypeName 注解。

@JsonTypeName("dog") 
public class Dog extends Animal{
// ... existing code ...}


1.使用ObjectMapper进行初始化:当您收到JSON响应并需要解析时,请使用支持 @JsonTypeInfoObjectMapper

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
AnimalData animalData = objectMapper.readValue(jsonString, AnimalData.class);

  • enableDefaultTyping * 方法用于配置 ObjectMapper,以在序列化的JSON中包含类型信息。

相关问题