Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将JSON字符串反序列化为具有接口数据成员的Java对象时出错_Java_Json - Fatal编程技术网

将JSON字符串反序列化为具有接口数据成员的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(

我有一个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

使用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可能已经有了解决此问题的内置解决方案,但我的初步反应是,它将遇到相同的问题。