首页 > Java > java教程 > 正文

如何使用 Jackson 将 JSON 反序列化为多态类型并避免编译错误?

Mary-Kate Olsen
发布: 2024-11-17 04:39:03
原创
311 人浏览过

How to Deserialize JSON with Jackson into Polymorphic Types and Avoid Compile Errors?

使用 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板