2011-02-25 16 views
1

看看下面的代碼,它工作正常:如何確定物體的類型在運行時的Java爲GSON

 MyData myData = new MyData(1, "one"); 
    MyData myData2 = new MyData(2, "two"); 
    MyData [] data = {myData, myData2}; 

    String toJson = gson.toJson(data, MyData[].class); 

    MyData [] newData = gson.fromJson(toJson, MyData[].class); 

MyData的僅僅是一個簡單的類int和字符串字段。這工作非常好。但是如果這個類直到運行時才知道呢?例如它可能不是「MyData」,但可能是一個完全不同的類。我們唯一知道的是這個類的名字(用一個字符串表示),這是以前由發件人使用Class.forName確定的。

它工作正常,如果對象不是數組,像這樣:

final Class<?> componentType = Class.forName(componentClassName); 
context.deserialize(someElement, componentType); 

上述技術不適用於陣列的工作,雖然。

有什麼建議嗎?

回答

-1
String toJson = gson.toJson(Class.forName(obj, runtimeClassName + "[]")); 
+0

你試試這個? – 2011-02-25 23:51:27

+0

這不會編譯。沒有這樣的方法forName只需要兩個參數。 – siiva33 2011-02-26 00:07:07

1

在Java中,你可以通過調用

object.getClass(); 

從Java文檔獲取類對象:

class Test { 
    public static void main(String[] args) { 
     int[] ia = new int[3]; 
     System.out.println(ia.getClass()); 
     System.out.println(ia.getClass().getSuperclass()); 
    } 
} 

它打印:

class [I 
class java.lang.Object 
1

你的意思MyData將成爲泛型類型T?如果是這樣,由於Java類型的擦除,你將無法做到這一點。類型T僅在編譯時可用。

您可以創建等的方法:

public T decodeJSON(String json, Class<T> type) { 
    GSON gson = new GSON(); 
    return gson.fromJson(json, type); 
} 
+0

我在說它可能是MyData類型的類,或者它可能是SomeOtherData類型的類。我唯一需要處理的是一個字符串,它定義了正在發送的類的類型(從Class.forName中檢索) – siiva33 2011-02-25 23:55:23

相關問題