2013-10-30 48 views
1

我有一個父類,比如P類和三個子類,比如C1,C2和C3。我在P類中有一個type變量來確定子類的類型。我有一個包含多個C1,C2和C3實例的P矢量,並使用Gson庫將該矢量對象轉換爲JSON。當我重建從JSON向量使用Gson給予類型爲向量<P>(我使用TypeToken的那個)我得到一個類P的向量,但是當我把P對象投給任何子類時,取決於type變量我得到ClassCastException。我怎樣才能做到這一點,無一例外?從JSON重建子對象

Type t = new TypeToken<Vector<P>>() {}.getType(); 
Vector ps=(Vector<P>)gson.fromJson(jsonString,t); 
for(P pObj : ps) { 
    if(pObj.type == 1) { 
     C1 cObj=(C1)pObj; 
    } 
    else if(pObj.type == 2) { 
     C2 cObj=(C2)pObj; 
    } 
    else if(pObj.type == 3) { 
     C3 cObj=(C3)pObj; 
    } 
} 
+1

發表一些代碼 –

+0

我不是Gson,但我使用simplejson。無論如何,我對這種代碼的經驗表明,json對象解組總是以這種方式給我們java對象。所以我通常使用List to Array並使用那些對象。在JavaScript中,因爲對象是無類型的,所以這些類型的代碼運行良好。 –

回答

1

當你反序列化,你會得到P的載體,所以你不能強制轉換爲基類,因爲具體類是P(而不是C [1-3]爲每個對象在Vector。我認爲,讓你得到想要的結果,唯一的機會就是寫自己的解串器。

我寫了一個非常詳細的answer具有相同的概念。它採用了List而不是Vector(更靈活),並使用一個字符串匹配基本類別,其餘部分完全是你應該繼續的方式

+0

如果您瞭解如何將問題映射到我給出的其他答案,請告訴我。 – giampaolo