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

dus*_*tdn 5 java serialization json jackson deserialization

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

module.addDeserializer(A.class, new CustomADeserializer());
module.addSerializer(A.class, new CustomASerializer())
Run Code Online (Sandbox Code Playgroud)

Sun*_*mar 12

您似乎错过了使用@JsonDeserialize(using = ImplementationClazz.class)来注释您的实现类,以指示用于反序列化抽象类或接口的类.

使用Jackson对具有多个实现的接口进行反序列化的简单示例.

这是我的界面

@JsonDeserialize(using = UserDeserializer.class)
public interface User {
}
Run Code Online (Sandbox Code Playgroud)

接口的一种实现

@JsonDeserialize(as = ServiceUser.class)
public class ServiceUser implements User{

    private String name;
    private String role;

    //constructor, setters & getters
Run Code Online (Sandbox Code Playgroud)

第二次实施

@JsonDeserialize(as = AdminUser.class)
public class AdminUser implements User {

    private String role;
    private String designation;

    //constructor, setters & getters
Run Code Online (Sandbox Code Playgroud)

这是De-serializer

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 your 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果不注释实现类,则可能会出现Stackoverflow错误.所有实现类都应该自行反序列化,否则它将使用导致StackOverflowError的父类反序列化器.


小智 8

以防万一有人需要一个解决方案来序列化和取消继承层次结构

您可以以更优雅的方式使用 Jackson 注释: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{
    // ...
}
Run Code Online (Sandbox Code Playgroud)