Java 如何在不修改父类的情况下反序列化包含抽象类的JSON数组?

Java 如何在不修改父类的情况下反序列化包含抽象类的JSON数组?,java,json,mongodb,jackson,jongo,Java,Json,Mongodb,Jackson,Jongo,我试图使用Jackson将持久化到MongoDB中的JSON数组反序列化为Java对象。我发现有许多教程提到通过添加以下内容来处理此多态性: @JsonTypeInfo(use=Id.CLASS,property=“\u CLASS”) 到超级类。但是,在我的情况下,我无法修改超类。那么,有没有一些解决方案可以在不修改超类的情况下解决这个问题呢?这是我的密码: public class User { @JsonProperty("_id") private String id;

我试图使用
Jackson
将持久化到MongoDB中的JSON数组反序列化为Java对象。我发现有许多教程提到通过添加以下内容来处理此多态性:

@JsonTypeInfo(use=Id.CLASS,property=“\u CLASS”)

超级类
。但是,在我的情况下,我无法修改
超类
。那么,有没有一些解决方案可以在不修改
超类的情况下解决这个问题呢?这是我的密码:

public class User {

    @JsonProperty("_id")
    private String id;
    private List<Identity> identities; // <-- My List contains objects of an abstract class; Identity
    public User(){
        identities = new ArrayList<Identity>();
    }
    public static Iterable<User> findAllUsers(){
        return users().find().as(User.class); // Always give me the errors
    }
    /*More code*/
}
公共类用户{
@JsonProperty(“\u id”)
私有字符串id;
私有列表标识;//可用于将具体实现类绑定到抽象类。如果无法修改抽象类,可用于告诉Jackson如何查找实现类

以下是一个例子:

public class JacksonAbstract {
    public static class User {
        private final String id;
        private final List<Identity> identities;

        @JsonCreator
        public User(@JsonProperty("_id") String id, @JsonProperty("identities") List<Identity> identities) {
            this.id = id;
            this.identities = identities;
        }

        @JsonProperty("_id")
        public String getId() {
            return id;
        }

        public List<Identity> getIdentities() {
            return identities;
        }
    }

    public static abstract class Identity {
        public abstract String getField();
    }

    @JsonDeserialize(as = IdentityImpl.class)
    public static abstract class IdentityMixIn {
    }

    public static class IdentityImpl extends Identity {
        private final String field;

        public IdentityImpl(@JsonProperty("field") String field) {
            this.field = field;
        }

        @Override
        public String getField() {
            return field;
        }
    }

    public static void main(String[] args) throws IOException {
        User u = new User("myId", Collections.<Identity>singletonList(new IdentityImpl("myField")));
        ObjectMapper mapper = new ObjectMapper();
        mapper.addMixInAnnotations(Identity.class, IdentityMixIn.class);
        String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(u);
        System.out.println(json);
        System.out.println(mapper.readValue(json, User.class));
    }
}
公共类JacksonAbstract{
公共静态类用户{
私有最终字符串id;
私人最终名单身份;
@JsonCreator
公共用户(@JsonProperty(“\u id”)字符串id,@JsonProperty(“标识”)列表标识){
this.id=id;
这个。身份=身份;
}
@JsonProperty(“\u id”)
公共字符串getId(){
返回id;
}
公共列表getIdentifications(){
返回身份;
}
}
公共静态抽象类标识{
公共抽象字符串getField();
}
@JsonDeserialize(as=IdentityImpl.class)
公共静态抽象类标识符mixin{
}
公共静态类标识IMPL扩展标识{
私有最终字符串字段;
公共标识IMPL(@JsonProperty(“字段”)字符串字段){
this.field=字段;
}
@凌驾
公共字符串getField(){
返回字段;
}
}
公共静态void main(字符串[]args)引发IOException{
用户u=新用户(“myId”,Collections.singletonList(新的IdentityImpl(“myField”));
ObjectMapper mapper=新的ObjectMapper();
mapper.addMixin符号(Identity.class、IdentityMixIn.class);
字符串json=mapper.writerWithDefaultPrettyPrinter().writeValueAsString(u);
System.out.println(json);
System.out.println(mapper.readValue(json,User.class));
}
}