繁体   English   中英

使用JsonTypeInfo从Jackson序列化中删除基类名称

[英]Remove base class name from Jackson serialization with JsonTypeInfo

这是我的继承设置:

抽象类Animal

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include =JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
    @JsonSubTypes.Type(value = Dog.class)})

public abstract class Animal {
}

具体的课程狗:

public class Dog extends Animal {

  private final String breed;

  public Dog(String breed) {
      this.breed = breed;
  }

  public String getBreed() {
      return breed;
  }
}

一个简单的Animal包装器类:

public class AnimalWrapper {

  private final Animal animal;

  public AnimalWrapper(Animal animal) {
      this.animal = animal;
  }

  public Animal getAnimal() {
      return animal;
  }
}

序列化代码:

ObjectMapper objectMapper = new ObjectMapper();
Animal myDog = new Dog("english shepherd");
AnimalWrapper animalWrapper = new AnimalWrapper(myDog);
String dogJson = objectMapper.writeValueAsString(animalWrapper);

dogJson的值是:

{"animal":{"Dog":{"breed":"english shepherd"}}}

我想要的是没有基类名称(动物)的JSON:

{"Dog":{"breed":"english shepherd"}}

我尝试在AnimalWrapper中的animal周围使用@JsonUnwrapped ,在这种情况下, animalDog都被消除了(这不是我想要的):

{"breed":"english shepherd"}

有什么方法可以实现我想要的吗?

我认为您遇到了杰克逊的弱点之一,在这里详细介绍...

展开的注释问题

我建议的解决方案是此处所述的自定义序列化程序...

杰克逊定制序列器

您将需要为AnimalWrapper自定义JsonSerializer ,以跳过该位。

public class ResponseSerializer extends JsonSerializer<AnimalWrapper> {


    @Override
    public void serialize(AnimalWrapper value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        final Object animal = value.getAnimal();
        Class<?> responseClass = animal.getClass();
        JavaType responseJavaType = serializers.constructType(responseClass);
        gen.writeStartObject();
        gen.writeFieldName(serializers.findTypeSerializer(responseJavaType).getTypeIdResolver().idFromValue(animal));
        serializers.findValueSerializer(responseClass).serialize(animal, gen, serializers);
        /* Here you must manually serialize other properties */
        /* Like gen.writeStringField("property", value.getProperty()); */
        gen.writeEndObject();
    }
}

注释您AnimalWrapper@JsonSerialize注解并指定自定义序列。

@JsonSerialize(using = ResponseSerializer.class)
public class AnimalWrapper<T> {

  private final T animal;

  public AnimalWrapper(T animal) {
      this.animal = animal;
  }

  public T getAnimal() {
      return animal;
  }
}

快速测试:

ObjectMapper objectMapper = new ObjectMapper();
Animal myDog = new Dog("english shepherd");
AnimalWrapper animalWrapper = new AnimalWrapper(myDog);
String dogJson = objectMapper.writeValueAsString(animalWrapper);
System.out.println(dogJson);

输出:

{“狗”:{“品种”:“英语牧羊人”}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM