第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

將 JSON 字符串反序列化為具有接口數(shù)據(jù)成員的 Java 對(duì)象時(shí)出錯(cuò)

將 JSON 字符串反序列化為具有接口數(shù)據(jù)成員的 Java 對(duì)象時(shí)出錯(cuò)

炎炎設(shè)計(jì) 2022-12-21 11:53:20
我有一個(gè) JSON 字符串,我想將它反序列化為一個(gè)帶有接口數(shù)據(jù)成員的 Java 對(duì)象。Java 對(duì)象如下所示:public class Person {     private String id;     private String name;     private AddressInterface addr;}Person 和 AddressInterface 都是第三方類,所以我無法對(duì)它們進(jìn)行任何更改。當(dāng)我使用以下反序列化 JSON 字符串時(shí), objectMapper.readValue(json_file, Person.class)  我得到以下異常。這是因?yàn)閷?duì)象映射器不知道如何反序列化 AddressInterface 字段。在這種情況下,有人可以讓我知道如何將字符串反序列化為 Person 對(duì)象嗎?非常感謝。 abstract types either need to be mapped to  concrete types, have custom deserializer,  or be instantiated with additional type information
查看完整描述

3 回答

?
搖曳的薔薇

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊

AddressInterface是一個(gè)接口,被認(rèn)為是抽象的。Foo和兩個(gè)類Bar都可以實(shí)現(xiàn)AddressInterface,但它無法判斷應(yīng)該將數(shù)據(jù)反序列化為哪一個(gè)。


可能有效的隨機(jī)想法:

將接口放在包裝器中。我只是在猜測(cè),因?yàn)槲也恢缊D書館的背景,但也許是這樣的。這里可能還有一些錯(cuò)別字,但它顯示了總體思路。



    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 放入其中,這可能會(huì)中斷。


編輯 2: @Hadi 注意是正確的,Gson 會(huì)讓一些事情變得更容易,但是它會(huì)遇到同樣的問題。我確實(shí)找到了這篇文章,它解釋了如何在使用 Gson 時(shí)修復(fù)它。它對(duì)我的回答使用了類似的方法,但他們有更好的解釋。



查看完整回答
反對(duì) 回復(fù) 2022-12-21
?
呼如林

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊

問題是反序列化 AddressInterface 屬性,因?yàn)樗且粋€(gè)接口,我認(rèn)為 objectMapper 正在嘗試初始化它的默認(rèn)構(gòu)造函數(shù),如下所示


addr = new AddressInterface();

您可以創(chuàng)建一個(gè)繼承 AddressInterface 的空具體類并使用它代替 AddressInterface


public class Adress implements AddressInterface {

...

}



public class Person {

 private String id;

 private String name;

 private Adress addr;

}


查看完整回答
反對(duì) 回復(fù) 2022-12-21
?
Smart貓小萌

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊

使用GSON庫(kù),您可以擺脫樣板代碼!

您可以在下面的鏈接中使用 GSON 庫(kù)!

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


查看完整回答
反對(duì) 回復(fù) 2022-12-21
  • 3 回答
  • 0 關(guān)注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)