【问题标题】:Java deserialization of generic type with Gson使用 Gson 对泛型类型进行 Java 反序列化
【发布时间】:2011-11-28 10:55:30
【问题描述】:

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

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

如何做到这一点,证明有关类型的信息?

【问题讨论】:

    标签: java generics deserialization gson


    【解决方案1】:

    是的,你可以。有一种解决方法。 您只需将“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. Type listType = 您的 listType 对象作为参数传递
    3. 类类型 = 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);
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果我只想提供 MyObject 类型作为参数?基本上将以下代码移动到方法中: Type listType = new TypeToken>(){}.getType(); TestResult 结果 = new Gson().fromJson(json, listType);这行得通吗?
      • 我猜listType 可以从MyObject.getType() 确定,但不幸的是我不知道如何。
      • 请看下面的答案
      猜你喜欢
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多