我有一个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
是一个接口,被认为是抽象的。两个类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 会使某些事情变得更容易是正确的,但它会遇到相同的问题。我确实找到了这篇文章,它解释了使用 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;
}