使用 Jackson 将 JSON 反序列化为多态类型:解决编译错误
在尝试使用 Jackson 实现多态 JSON 反序列化时,用户可能会遇到编译错误-时间错误“ObjectMapper 类型中的方法 readValue(JsonParser, Class) 不适用于调用 mapper.readValue(root, AnimalClass) 时的参数 (ObjectNode, Class
要解决此问题,请考虑利用 Jackson 的基于注释的方法进行多态反序列化。这涉及到向抽象 Animal 类及其子类(Dog 和 Cat)添加 @JsonTypeInfo、@JsonSubTypes 和 @JsonIgnoreProperties 注释。下面是一个示例:
@JsonIgnoreProperties(ignoreUnknown = true) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY) @JsonSubTypes({ @JsonSubTypes.Type(value = Dog.class, name = "Dog"), @JsonSubTypes.Type(value = Cat.class, name = "Cat") }) public abstract class Animal { protected String name; // Getters and setters for the name property }
在子类中,您可以根据需要指定其他属性。例如,Dog 可能有一个 Breed 属性,而 Cat 有一个 favoriteToy 属性。
将 JSON 反序列化为 Animal 对象时,Jackson 将使用 @type 属性来确定要实例化的特定子类。这是一个示例测试用例:
ObjectMapper objectMapper = new ObjectMapper(); Animal myDog = new Dog("ruffus", "english shepherd"); Animal myCat = new Cat("goya", "mice"); String dogJson = objectMapper.writeValueAsString(myDog); Animal deserializedDog = objectMapper.readValue(dogJson, Animal.class); String catJson = objectMapper.writeValueAsString(myCat); Animal deseriliazedCat = objectMapper.readValue(catJson, Animal.class);
这种方法允许将多态 JSON 无缝反序列化到其相应的子类中,避免前面提到的编译时错误。
以上是如何使用 Jackson 将 JSON 反序列化为多态类型并避免编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!