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

时间:2019-05-29 16:21:02

标签: java json

我有一个JSON字符串,我想将其反序列化为带有接口数据成员的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

3 个答案:

答案 0 :(得分:1)

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会使某些事情变得容易,但这是同样的问题,这是正确的。我确实找到了this article,它说明了使用Gson时如何解决。它为我的答案使用了类似的方法,但是它们有一个更好的解释。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

问题在于反序列化AddressInterface属性,因为它是一个接口,我认为objectMapper试图初始化它的默认构造函数,例如波纹管

addr = new AddressInterface();

您可以创建一个空的具体类,该类继承AddressInterface并使用它代替AddressInterface

public class Adress implements AddressInterface {
...
}


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