我有一类动物
public class Animal {
String type; // Can be dog, cat, elephant
String name;
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME, property = "type", include = JsonTypeInfo.As.EXTERNAL_PROPERTY, visible = true)
AnimalDetails animalDetails;
}
我有一个 AnimalDetails
基于外部属性反序列化的抽象类 type
.
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME, property = "type", include = JsonTypeInfo.As.EXTERNAL_PROPERTY, visible = true)
public abstract class AnimalDetails {
}
我有一节课 DogDetails
是类的一个子类 AnimalDetails
```
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeName("dog")
public class DogDetails extends AnimalDetails{
String type;
@Builder
public DogDetails(String type){
this.type = type;
}
}
dogdetails还包含一个字段 `type` 我用过 `@JsonTypeName` 注解说明反序列化为dogdetails时 `type` 是“狗”。
当我试图序列化 `DogDetails` 然后我得到两个 `type` 领域。
import com.fasterxml.jackson.databind.ObjectMapper;
import io.harness.ng.remote.NGObjectMapperHelper;
import lombok.extern.slf4j.Slf4j;
@Slf4j
class Scratch {
public static void main(String[] args) {
DogDetails dog = DogDetails.builder().type("GermanShepherd").build();
ObjectMapper objectMapper = new ObjectMapper();
NGObjectMapperHelper.configureNGObjectMapper(objectMapper);
String jsonValue = "";
try {
jsonValue = objectMapper.writeValueAsString(dog);
}catch(Exception ex){
logger.info("Encountered exception ", ex);
}
logger.info(jsonValue);
}
}
输出: `{"type":"dog","type":"GermanShepherd"}` 预期输出: `{"type":"GermanShepherd"}` 我期待一个单一的类型,我如何才能解决这个问题?
Jackson版本:2.7.9
例子( `DogDetails` 以及 `AnimalDetails` )代表了我正在解决的问题。这个问题的最佳解决方案可能是更改变量名(类型),但是这个模式是由我们的产品团队决定的,我不能更改这个模式。
1条答案
按热度按时间u1ehiz5o1#
我想你可以补充一下
@JsonIgnoreType
您的子类来解决这个问题: