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));
}
}