如何使用jackson将自定义反序列化器添加到接口
说我有一个接口A,我想为所有类实现接口A使用自定义反序列化器,所以我使用下面的代码,但它不起作用,而CustomAserializer工作。 那么我该如何使用我的自定义反序列化器反序列化所有类实现A. 谢谢。
module.addDeserializer(A.class, new CustomADeserializer()); module.addSerializer(A.class, new CustomASerializer())
您似乎错过了使用@JsonDeserialize(using = ImplementationClazz.class)来注释您的实现类,以指示用于反序列化抽象类或接口的类。
使用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
这是De-serializer
public class UserDeserializer extends JsonDeserializer { @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的父类反序列化器。
- 如何不在jackson发送空集合
- 如何阻止Jackson序列化多态类型的注释属性?
- jackson – @JsonTypeInfo属性被映射为null?
- 使用Jackson将JSON字符串转换为Java映射时出错
- 使用jackson删除JSON元素
- jackson列表反序列化。 嵌套列表
- 如何通过jackson生成器html转义值
- 当jackson反序列化失败时,Jerseyexception映射器无法正常工作
- java.lang.ClassNotFoundException:org.springframework.http.converter.json.MappingJackson2HttpMessageConverter