Jackson框架提供了基于注释的方法,用于在序列化过程中发出类型信息。
我不想在我的超类(Animal)中使用@JsonSubTypes注释。
相反,我想告诉我的子类,即狗和大象,动物是他们的父母。
如果没有在Animal类中使用注释,是否有任何方法可以这样做。
如果是,请提供尽可能做同样的例子。
以下是我试图解决的案例。“测试”收到的JSON,包含“类型”字段为“狗”或“大象”。
我想将这两个类注册为“Animal”类的子类型,但不想在Animal中使用@JsonSubTypes。
任何帮助将不胜感激。 提前谢谢。
@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
abstract class Animal(){
private String sound;
private String type;
//getters and setters
}
@JsonTypeName("dog")
Class Dog extends Animal(){
//some attributes.
//getters and setters
}
@JsonTypeName("elephant")
Class Elephant extends Animal(){
//some attributes.
//getters and setters
}
@Controller
public class MyController {
//REST service
@RequestMapping( value = "test")
public @ResponseBody String save(@RequestBody Animal animal){
System.out.println(animal.getClass());
return success;
}
}
答案 0 :(得分:2)
这个答案将有助于实现您的目标,但方式略有不同。 创建一个具有必要配置的单独类,并将其注册为Animal类的序列化/反序列化配置类,如下所示:
配置类:
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@Type(value = Elephant.class, name = "cat"),
@Type(value = Dog.class, name = "dog") })
abstract class PolymorphicAnimalMixIn {
//Empty Class
}
序列化或反序列化:
ObjectMapper mapper = new ObjectMapper();
mapper.getDeserializationConfig().addMixInAnnotations(Animal.class, PolymorphicAnimalMixIn.class);
mapper.getSerializationConfig().addMixInAnnotations(Animal.class, PolymorphicAnimalMixIn.class);
//Sample class with collections of Animal
class Zoo {
public Collection<Animal> animals;
}
//To deserialize
Animal animal = mapper.readValue("string_payload", Zoo.class);
//To serialize
Animal animal = mapper.writeValueAsString(zoo);
参考积分:example 5
答案 1 :(得分:1)
您可以使用Moonwlker库。
有了它,您可以像这样创建一个ObjectMapper:
ObjectMapper objectMapper = new ObjectMapper();
MoonwlkerModule module =
MoonwlkerModule.builder()
.fromProperty("type").toSubclassesOf(Animal.class)
.build();
objectMapper.registerModule(module);
然后使用该映射器进行(反)序列化。 Moonwlker网站包含更多详细信息和配置选项。