java—将外部\u属性与@jsontypename一起使用时,序列化字符串中的两个类型字段

dgenwo3n  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(224)

我有一类动物

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` )代表了我正在解决的问题。这个问题的最佳解决方案可能是更改变量名(类型),但是这个模式是由我们的产品团队决定的,我不能更改这个模式。
u1ehiz5o

u1ehiz5o1#

我想你可以补充一下 @JsonIgnoreType 您的子类来解决这个问题:

@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeName("dog")
@JsonIgnoreType
public class Dog extends AnimalDetails{
    String type;

    @Builder
    public Dog(String type){
        this.type = type;
    }
}

相关问题