我有一个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
答案 0 :(得分:1)
AddressInterface
是一个接口,被认为是抽象的。 Foo
和Bar
这两个类都可以实现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)
答案 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;
}