如何使用 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 不相似,那么您需要将其添加到您的答案中,以便我们可以进一步帮助您。
我的情况很简单。我有一个包含以下字段的主 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 不相似,那么您需要将其添加到您的答案中,以便我们可以进一步帮助您。