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

标签 java json

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

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

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

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

 objectMapper.readValue(json_file, Person.class)  

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

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

最佳答案

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

可能有效的随机想法:

将接口(interface)放入包装器中。我只是猜测,因为我不知道图书馆的上下文,但也许是这样的。另外,这里可能有一些错别字,但它显示了总体思路。


    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 会使某些事情变得更容易,这是正确的,但它会遇到相同的问题。我确实找到了this article其中解释了如何在使用 Gson 时修复它。它使用与我的答案类似的方法,但他们有更好的解释。

关于java - 将 JSON 字符串反序列化为具有接口(interface)数据成员的 Java 对象时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56364831/

相关文章:

jquery - 仅使用 JQuery 更新 Twitter (OAuth)

python - 删除 json 文件中的键引发列表索引错误

java - 应用程序崩溃 android Activity t40}}} 超时

java - 如何分析 Java 1.3 中的内存泄漏

java - DataNucleus/NeoDatis - 数据库连接似乎关闭,导致持久对象丢失

java - Spring Cloud快速入门演示maven

java - 在 fedora 14 中运行 Tomcat

javascript - 无法将带有 JSON 对象的变量传递给 for 循环

java - 如何使用包含 HashMap 和另一个属性的 gson 反序列化 JSON?

php - 重复 id 或其他记录的数组内的数组