将 JSON 字符串反序列化为具有接口数据成员的 Java 对象时出错



我有一个JSON字符串,我想将其反序列化为具有接口数据成员的Java对象。 Java 对象如下所示:

public class Person {
     private String id;
     private String name;
     private AddressInterface addr;
}

Person 和 AddressInterface 都是第三方类,所以我无法对它们进行任何更改。

当我使用以下方法反序列化 JSON 字符串时,

 objectMapper.readValue(json_file, Person.class)  

我得到了以下例外。 这是因为对象映射器不知道如何反序列化地址接口字段。 在这种情况下,有人可以让我知道如何将字符串反序列化为 Person 对象吗? 非常感谢。

 abstract types either need to be mapped to 
 concrete types, have custom deserializer, 
 or be instantiated with additional type information
AddressInterface是一个

接口,被认为是抽象的。两个类FooBar都可以实现AddressInterface,但它无法判断数据应该反序列化为哪一个。

可能有效的随机想法:

将接口放在包装器中。我只是猜测,因为我不知道库上下文,但也许是这样的。这里可能还有一些错别字,但它显示了总体思路。


    public class AbstractSerializable<T> implements Deserialize {
        private final String className;
        private T obj;
        public AbstractSerializable(T obj) {
              this.obj = obj;
              this.className = obj.getClass().getCardinalName();
        }
        @Override
        public AbstractSerializable deserialize(ObjectMapper objectMapper) {
             String clazz = input.readNext(String.class);
             return objectMapper.readNext(Class.forName(clazz));
        }
    }

编辑:如果您尝试在其中放置 lambda,这可能会中断。

编辑 2:@Hadi请注意,Gson 会使某些事情变得更容易是正确的,但它会遇到相同的问题。我确实找到了这篇文章,它解释了使用 Gson 时如何修复它。它对我的回答使用了类似的方法,但他们有一个更好的解释。

使用GSON库,您可以摆脱样板代码!

您可以在下面的链接中使用GSON库!

https://www.tutorialspoint.com/gson/gson_quick_guide.htm

问题是反序列化AddressInterface属性,因为它是一个接口,我认为objectMapper正在尝试启动它的默认构造函数,如下面的

addr = new AddressInterface();

您可以创建一个空的具体类,该类继承了地址接口并使用它而不是地址接口

public class Adress implements AddressInterface {
...
}

public class Person {
 private String id;
 private String name;
 private Adress addr;
}

最新更新