我有一个 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),被认为是抽象的。 Foo
和 Bar
两个类都可以实现 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/