用Gson实现泛型类型的Java反序列化

用Gson实现泛型类型的Java反序列化,java,generics,deserialization,gson,Java,Generics,Deserialization,Gson,我正在尝试反序列化一些泛型类型。它工作得很好,但我想把这段代码换成一个方法 Type listType = new TypeToken<TestResult<MyObject>>(){}.getType(); TestResult<MyObject> result = new Gson().fromJson(json, listType); Type listType=new-TypeToken(){}.getType(); TestResult=new G

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

Type listType = new TypeToken<TestResult<MyObject>>(){}.getType();
TestResult<MyObject> result = new Gson().fromJson(json, listType);
Type listType=new-TypeToken(){}.getType();
TestResult=new Gson().fromJson(json,listType);
我如何做到这一点,证明有关类型的信息?

您不能。 在运行时无法确定泛型的类型


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

可以。有一个变通办法。 您只需显式地将“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;
    }
public对象getGenericDataObjectFromJson(字符串json,类型t,类类型){
//将Json字符串转换为Java对象
TestResult obj=gson.fromJson(json,t);
返回obj;
}
在哪里

  • String json=您的json字符串
  • Type listType=作为参数传递的listType对象
  • 类类型=MyObject.Class
  • 方法调用会变成这样

    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);
    
    GsonUtility gs=new GsonUtility();//您的gson实用程序类
    JSONObject jsonObj=“您的json字符串”;
    //显式标识类型以便将其传递给方法
    //正如#CKuk所说,因为泛型的类型无法在运行时确定
    Type objectType=new-TypeToken(){}.getType();
    TestResult resultObject=(TestResult)gs.getGenericDataObjectFromJson(jsonObj.toString(),objectType,MyObject.class);
    
    如果我只想提供MyObject类型作为参数?基本上将以下代码移动到一个方法中:Type listType=new TypeToken(){}.getType();TestResult=new Gson().fromJson(json,listType);这行得通吗?我想可以通过
    MyObject.getType()
    来确定
    listType
    ,但遗憾的是我不知道如何确定。请看下面的答案