使用Gson对泛型类型进行Java反序列化

时间:2011-11-28 10:55:30

标签: java generics deserialization gson

我正在尝试反序列化一些泛型类型。它工作得很好,但我想把这段代码换成一个方法。

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

如何执行此操作,证明有关类型的信息?

2 个答案:

答案 0 :(得分:2)

是的,你可以。有一个解决方法。 您只需要将“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. String json =您的json字符串
  2. 类型listType =作为参数传递的listType对象
  3. 类类型= MyObject.class
  4. 方法调用就像这样

    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);
    

答案 1 :(得分:0)

你做不到。 在运行时期间无法确定泛型的类型。

一个简单的解决方法是向MyObject添加一个方法以返回结果类型(如代码示例的第一行)。