为了账号安全,请及时绑定邮箱和手机立即绑定

将 JSON 字符串反序列化为具有接口数据成员的 Java 对象时出错

将 JSON 字符串反序列化为具有接口数据成员的 Java 对象时出错

炎炎设计 2022-12-21 11:53:20
我有一个 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
查看完整描述

3 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

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 时修复它。它对我的回答使用了类似的方法,但他们有更好的解释。



查看完整回答
反对 回复 2022-12-21
?
呼如林

TA贡献1798条经验 获得超3个赞

问题是反序列化 AddressInterface 属性,因为它是一个接口,我认为 objectMapper 正在尝试初始化它的默认构造函数,如下所示


addr = new AddressInterface();

您可以创建一个继承 AddressInterface 的空具体类并使用它代替 AddressInterface


public class Adress implements AddressInterface {

...

}



public class Person {

 private String id;

 private String name;

 private Adress addr;

}


查看完整回答
反对 回复 2022-12-21
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

使用GSON库,您可以摆脱样板代码!

您可以在下面的链接中使用 GSON 库!

https://www.tutorialspoint.com/gson/gson_quick_guide.htm


查看完整回答
反对 回复 2022-12-21
  • 3 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号