如何使用jackson将自定义反序列化器添加到接口

时间:2014-08-19 15:59:44

标签: java json serialization jackson deserialization

说我有一个接口A,我想为所有类实现接口A使用自定义反序列化器,所以我使用下面的代码,但它不起作用,而CustomAserializer工作。 那么我应该怎么做反序列化所有类使用我的自定义反序列化器实现A. 感谢。

module.addDeserializer(A.class, new CustomADeserializer());
module.addSerializer(A.class, new CustomASerializer())

2 个答案:

答案 0 :(得分:9)

您似乎错过了使用@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

这是解串器

 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的父类反序列化。

答案 1 :(得分:2)

以防万一有人需要解决方案以对继承层次结构进行序列化和反序列化

您可以以更优雅的方式使用杰克逊注释:JsonTypeInfoJsonSubTypes

 @JsonTypeInfo(
  use = JsonTypeInfo.Id.NAME, 
  include = JsonTypeInfo.As.PROPERTY, 
  property = "type")
@JsonSubTypes({ 
  @Type(value = ServiceUser.class, name = "service"), 
  @Type(value = AdminUser.class, name = "admin") 
})
public interface User{
    // ...
}