[英]Jackson serialization using JsonTypeInfo WRAPPER_OBJECT
[英]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
,在这种情况下, animal
和Dog
都被消除了(这不是我想要的):
{"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.