如何使用jackson将自定义反序列化器添加到接口 [英] How to add custom deserializer to interface using jackson
问题描述
说我有一个接口A,我想为所有类实现接口A使用自定义反序列化器,所以我使用下面的代码,但它不起作用,而CustomAserializer工作。
那么我该如何使用我的自定义反序列化器反序列化所有类实现A.
谢谢。
Saying I have an interface A, I want to use custom deserializer for all classes implement interface A, So I use code below but it doesn't work, While CustomAserializer works. So what should I do to deserialize all classes implement A using my custom deserializer. Thanks.
module.addDeserializer(A.class, new CustomADeserializer());
module.addSerializer(A.class, new CustomASerializer())
推荐答案
您似乎错过了使用@JsonDeserialize(using = ImplementationClazz.class)来注释您的实现类,以指示用于反序列化抽象类或接口的类。
It seems you missed to annotate your implementation classes with @JsonDeserialize(using = ImplementationClazz.class) to indicate the class to be used to deserialize the abstract class or Interface.
使用Jackson对具有多个实现的接口进行反序列化的简单示例。
A simple example to deserialize a interface having multiple implementations using Jackson.
这是我的界面
@JsonDeserialize(using = UserDeserializer.class)
public interface User {
}
接口的一个实现
@JsonDeserialize(as = ServiceUser.class)
public class ServiceUser implements User{
private String name;
private String role;
//constructor,setters & getters
第二次实施
@JsonDeserialize(as = AdminUser.class)
public class AdminUser implements User {
private String role;
private String designation;
//constructor,setters & getters
这里是反序列化器
public class UserDeserializer extends JsonDeserializer<User> {
@Override
public User deserialize(JsonParser jp, DeserializationContext context) throws IOException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
ObjectNode root = mapper.readTree(jp);
/*write you own condition*/
if (root.has("name") && root.get("name").asText().equals("XYZ")) {
return mapper.readValue(root.toString(), ServiceUser.class);
}
return mapper.readValue(root.toString(), AdminUser.class);
}
}
如果您没有注释,可能会出现Stackoverflow错误实现类。所有实现类都应该自行反序列化,否则它将使用导致StackOverflowError的父类反序列化。
You may get Stackoverflow error if you doesn't annotate implementation class.All implementation class should deserialize with themselves, else it will use the parent class deserializer which leads to StackOverflowError.
这篇关于如何使用jackson将自定义反序列化器添加到接口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!