2011-11-28 100 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); 

希望这有助于人。 如果它解决了您的问题,请不要忘记标记为答案;)