将JSON字符串反序列化为具有接口数据成员的Java对象时出错
我有一个JSON字符串,我想将其反序列化为带有接口数据成员的Java对象。Java对象如下所示:将JSON字符串反序列化为具有接口数据成员的Java对象时出错,java,json,Java,Json,我有一个JSON字符串,我想将其反序列化为带有接口数据成员的Java对象。Java对象如下所示: public class Person { private String id; private String name; private AddressInterface addr; } Person和AddressInterface都是第三方类,因此我无法对它们进行任何更改 当我使用以下命令反序列化JSON字符串时 objectMapper.readValue(
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
使用GSON库,您可以摆脱样板代码 您可以在下面的链接中使用GSON库
问题在于反序列化AddressInterface属性,因为它是一个接口,我认为objectMapper正在尝试初始化它的默认构造函数,如bellow
addr = new AddressInterface();
您可以创建一个继承AddressInterface的空具体类,并使用它来代替AddressInterface
public class Adress implements AddressInterface {
...
}
public class Person {
private String id;
private String name;
private Adress addr;
}
AddressInterface
是一个接口,被认为是抽象的。这两个类Foo
和Bar
都可以实现AddressInterface
,但它无法判断数据应该反序列化为哪一个
可能有效的随机想法:
将接口放入包装器中。我只是猜测,因为我不知道库的上下文,但可能是这样的。这里可能也有一些拼写错误,但它显示了总体思路
公共类AbstractSerializable实现反序列化{
私有最终字符串类名;
私人T obj;
公共抽象可序列化(T obj){
this.obj=obj;
this.className=obj.getClass().getCardinalName();
}
@凌驾
公共抽象序列化反序列化(ObjectMapper ObjectMapper){
String clazz=input.readNext(String.class);
返回objectMapper.readNext(Class.forName(clazz));
}
}
编辑:如果您尝试在其中添加lambda,则此功能可能会中断
编辑2:@Hadi注意到Gson会使一些事情变得更简单,这是正确的,但是它会遇到同样的问题。我确实找到了在使用Gson时如何修复它的原因。它使用了与我的答案类似的方法,但它们有更好的解释。看看这一点:您没有在AddressInterface中实现正确的反序列化。java您可以共享代码文件以获得有关问题的更多详细信息吗?接口是抽象的,因为它不知道实现接口的类型。您可以为接口的类名添加一个字段,并添加一个自定义反序列化,以检索要使用的正确类。@Locke谢谢,但我不能对接口或Person类进行任何更改。谢谢。但是我不能改变人的等级。这超出了我的控制。创建自己的Person类怎么样?Gson可能已经有了解决此问题的内置解决方案,但我的初步反应是,它将遇到相同的问题。