2011-11-28 82 views
3

我試圖反序列化一些泛型類型。它工作的很好,但我想把這個和平的代碼換成一種方法。與Gson的泛型類型的Java反序列化

Type listType = new TypeToken<TestResult<MyObject>>(){}.getType(); 
TestResult<MyObject> result = new Gson().fromJson(json, listType); 

如何做到這一點,證明有關類型的信息?謝謝!

kon

回答

1

你不能。 泛型的類型無法在運行時確定。

一個簡單的解決方法是將方法添加到MyObject以返回生成的類型(如代碼示例的第一行)。

+0

如果我只是想提供MyObject類型作爲參數?基本上將下面的代碼移動到一個方法中: 類型listType = new TypeToken >(){}。getType(); TestResult result = new Gson()。fromJson(json,listType); 這是行不通的? – kon

+0

我猜'listType'可以從'MyObject.getType()'確定,但不幸的是我不知道如何。 – CKuck

+0

請看下面的答案 –

1

是的,你可以。有一個解決方法。 你只需要將「Type」和類「MyObject」傳遞給方法就可以了。

在你的情況

發展具有以下特徵和身體

public <T> Object getGenericDataObjectFromJson(String json, Type t, Class<T> type) { 

     // Convert Json String to Java object 
     TestResult<T> obj = gson.fromJson(json, t); 

     return obj; 
    } 

  1. 字符串JSON =您的JSON字符串
  2. 類型listType =您的listType對象傳遞的方法作爲參數
  3. Class type = MyObject.c LASS

而且方法調用會變成這個樣子

GsonUtility gs = new GsonUtility();// Your gson utility class 
JSONObject jsonObj = "your json string"; 

// Explicitly identifying the type so as to pass it to the method 
// Because The type of a generics can't be determinted during runtime as #CKuk said 

Type objectType = new TypeToken<DataObject<objectType>>(){}.getType(); 

TestResult<MyObject> resultObject= (TestResult<MyObject>) gs.getGenericDataObjectFromJson(jsonObj.toString(), objectType, MyObject.class); 

希望這有助於人。 如果它解決了您的問題,請不要忘記標記爲答案;)