使用 Jackson 将 JSON 反序列化为多态类型:解决编译错误
在尝试使用 Jackson 实现多态 JSON 反序列化时,用户可能会遇到编译错误-时间错误“ObjectMapper 类型中的方法 readValue(JsonParser, Class) 不适用于调用 mapper.readValue(root, AnimalClass) 时的参数 (ObjectNode, Class)”。此错误是由于提供的参数与预期的类型签名之间不兼容而引起的。
要解决此问题,请考虑利用 Jackson 的基于注释的方法进行多态反序列化。这涉及到向抽象 Animal 类及其子类(Dog 和 Cat)添加 @JsonTypeInfo、@JsonSubTypes 和 @JsonIgnoreProperties 注释。下面是一个示例:
1 2 3 4 5 6 7 8 9 10 11 12 | @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;
}
|
登录后复制
在子类中,您可以根据需要指定其他属性。例如,Dog 可能有一个 Breed 属性,而 Cat 有一个 favoriteToy 属性。
将 JSON 反序列化为 Animal 对象时,Jackson 将使用 @type 属性来确定要实例化的特定子类。这是一个示例测试用例:
1 2 3 4 5 6 7 8 9 10 11 | 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中文网其他相关文章!