2016-02-15 76 views
0

我有一個名爲「Clerk」的具體類,它實現了一個名爲「Worker」的接口。我想反序列化我的祕書對象,並將其存儲到一個工人對象,就像我們通常可以做,如果我有這樣的:將具體類型的對象反序列化爲接口類型

Worker clerkWorker = new Clerk("abc", "alice white"); 

只有而是我有,我想反序列化,並存儲到clerkWorker店員JSON:

{ 
    "uid": "1a-2wq" 
    "name": "Maryanne Chen" 
} 

接口:

public interface Worker { 
    int getUID(); 
    String getName(); 
    void work(); 
} 

類實現它:

private class Clerk implements Worker { 
    int uid; 
    String name; 

    public Clerk(id, fullname) { 
    uid = id; 
    name = fullname; 
    } 

    public void work() { 
    System.out.println("Clerk is processing files"); 
    } 
} 

按照這裏介紹的第二個解決方案:Using Gson with Interface Types我複製RuntimeTypeAdapterFactory本地使用它:

RuntimeTypeAdapterFactory typeFactory =  
RuntimeTypeAdapterFactory.of(Worker.class, "type"); 
typeFactory.registerSubtype(Clerk.class); 
Gson gson = new GsonBuilder().registerTypeAdapterFactory(typeFactory).create(); 

final Reader r = getReader(jsonFile); 
return gson.fromJson(r, typeToken.getType()); 

我已經驗證了我的getReader功能正在工作。我收到一個異常:

「無法反序列化接口Worker,因爲它沒有定義名爲type的字段」。

+0

你是什麼'json'好像? – njzk2

回答

0

如果ClerkWorker,那麼不應該有任何理由不能完全按照您已經用構造函數示例展示的內容。

Worker w = (new Gson()).fromJson(jsonData, Clerk.class) ; 

我不知道爲什麼你要那麼多像這樣向上投向右走,因爲任何想要一個Worker應該能夠採取直接Clerk ...

0

當你告訴Gson反序列化一個接口類型的東西時,它必須找出它應該使用哪個實現類。它通過檢查json數據中的特殊字段來實現這一點。當你打電話給RuntimeTypeAdapterFactory.of(Worker.class, "type");時,你告訴Gson它應該檢查的字段以確定它應該使用哪個類名爲「type」。當你給它一個沒有該字段的json數據時,它會抱怨。

要解決這個問題,您需要將「type」字段添加到您的json數據中,或者在代碼中將Gson反序列化爲Clerk而不是Worker

+0

我向Clerk.java中添加了私有字符串類型,並在json「type」中添加了:「Clerk」,同樣的錯誤 – Marc

+0

@Marc請改用完全限定名稱(「your.package.here.Clerk」)。我必須仔細查看文檔,但這是我對默認預期的猜測。 – Douglas

+0

不,你不應該需要這個,不是用戶名也不是。我只想反序列化Clerk類型的json並將其存儲在Worker類型中。 – Marc

相關問題