如何使用 Jackson mapper 自动识别不同类型

How to identify different types automatically using Jackson mapper

我的情况很简单。我有一个包含以下字段的主 DTO class: AnimalDTO

public class AnimalDTO {
    @JsonCreator
    public AnimalDTODTO(@JsonProperty("error") boolean error,
                                       @JsonProperty("errorMessage") String errorMessage,
                                       @JsonProperty("cat") CatDTO cat,
                                       @JsonProperty("dog") DogDTO dog) {
        this.error = error;
        this.errorMessage = errorMessage;
        this.cat = cat;
        this.dog = dog;
    }

    private boolean error;
    private String errorMessage;
    private CatDTO cat;
    private DogDTO dog;
}

CatDTO:

public class CatDTO {
    @JsonCreator
    public CatDTO(@JsonProperty("catNumber") String catNumber,
                  @JsonProperty("catState") String catState) {
        this.catNumber = catNumber;
        this.catState = catState;
    }

    private String catNumber;
    private String catState;
}

DogDTO:

public class DogDTO {
    @JsonCreator
    public DogDTO(@JsonProperty("dogNumber") String dogNumber,
                  @JsonProperty("dogState") String dogState
                  @JsonProperty("dogColor") String dogColor
                  @JsonProperty("dogBalance") BigDecimal dogBalance) {
        this.dogNumber = dogNumber;
        this.dogState = dogState;
        this.dogColor = dogColor;
        this.dogBalance = dogBalance;
    }

    private String dogNumber;
    private String dogState;
    private String dogColor;
    private BigDecimal dogBalance;

}

从外部 API 我对 dog 有回复(而且我无法更改),例如:

{
   "dogNumber": "23",
   "dogState": "good",
   "dogColor": "pink",
   "dogBalance": 5
}

Cat:

{
   "catNumber": "1",
   "catState": "good"
}

我想像这样使用 Jackson 映射器:objectMapper.readValue(stringJson, AnimalDTO.class);

我想添加 AnimalDTO:

@JsonTypeInfo(
  use = JsonTypeInfo.Id.NAME, 
  include = JsonTypeInfo.As.PROPERTY, 
  property = "type")
@JsonSubTypes({ 
  @Type(value = CatDTO.class, name = "cat"), 
  @Type(value = DogDTO.class, name = "dog") 
})

但它不起作用。

如何以最好的方式处理我的案件?

如果您从外部 API 获得的 JSON 如下所示,您的代码将正常工作(没有任何 @JsonTypeInfo@JsonSubTypes 注释):

{
  "dog": {
    "dogNumber": "23",
    "dogState": "good",
    "dogColor": "pink",
    "dogBalance": 5
  },
  "cat": {
    "catNumber": "1",
    "catState": "good"
  }
}

如果这看起来与您收到的 JSON 不相似,那么您需要将其添加到您的答案中,以便我们可以进一步帮助您。