2010-11-17 110 views
5

好吧,我不得不承認,我不擅長泛型類型在Java中JSON序列化/反序列化的泛型類型與谷歌,GSON

我已經寫在C#中使用JSON序列化/反序列化類JavaScriptSerializer

private static JavaScriptSerializer js = new JavaScriptSerializer(); 

    public static T LoadFromJSONString<T>(string strRequest) 
    { 
     return js.Deserialize<T>(strRequest); 
    } 

    public static string DumpToJSONString<T>(T rq) 
    { 
     return js.Serialize(rq); 
    } 

它在C#中運行良好。現在我試圖轉換或至少在Java中編寫另一個JSON序列化/反序列化類。我試過flexjsongoogle-gson但我不知道如何在Java中指定<T>。

有人可以幫我嗎?順便說一句,我更喜歡谷歌,GSON

回答

9

在Java中,您必須傳遞實際的類型擦除類,而不僅僅是類型參數,因此數據綁定器知道使用哪種類型;所以像這樣:

public static T LoadFromJSONString<T>(string strRequest, Class<T> type) 
{ 
    Gson gson = new Gson(); 
    return gson.fromJson(strRequest, type); 
} 

但這通常只需要反序列化;當序列化時,你有一個庫可以使用的類的實例。

順便說一句,你可能要考慮使用的另一個好的Java JSON庫是Jackson;然而,對於這個特定的例子,你提到的所有庫都應該工作。

+0

嗯,但是假設我只有類信息作爲字符串,例如'String clazz =「com.example.Response」',那麼我怎樣才能使用這段代碼呢? – 2010-11-22 07:27:53

+2

您可以使用Class.forName(「com.example.Response」)來查找它。 – StaxMan 2010-11-23 00:57:38

+0

是的,我已經嘗試過了。但事情是,當我使用'Class.forName()'時,返回類型必須是'Object'而不是'Response',我必須清楚地聲明如下:'Response rp =(Response)LoadFromJSONString(resString ,Class.forName(「com.example.Response」))' – 2010-11-23 02:26:44

0

這應該工作:

import com.google.gson.Gson; 
public class GenericClass { 

    private static Gson gson = new Gson(); 

    public static <T> T loadFromJSONString(String strRequest) 
    { 
     return (T) gson.fromJson(strRequest, T.class); 
    } 

    public static <T> String dumpToJSONString(T rq) 
    { 
     return gson.toJson(rq); 
    } 
} 
+0

嗯,等等。這是行不通的。此行導致問題: return(T)gson.fromJson(strRequest,T.class); – 2010-11-19 10:05:42

+0

與我的答案相同,T.class不起作用 – 2010-11-19 15:58:15

1

通過我不認爲這是解決這個漂亮的方式,因爲它是在你的C#代碼進行思考之後。這是因爲java編譯器完成的類型擦除。

對於您來說,最好的解決方案可能是在知道需要序列化/反序列化的對象類型的位置使用Gson對象。

如果你並不熱衷於每次創建Gson對象的實例,那麼至少可以保留一個靜態對象,因爲它在創建時不需要任何類型參數。