【问题标题】:JSON Serialize / Deserialize generic type with google-gson使用 google-gson 的 JSON 序列化/反序列化泛型类型
【发布时间】:2010-11-17 02:43:58
【问题描述】:

好吧,我不得不承认我不擅长 Java 中的泛型类型

我使用 JavaScriptSerializer 在 C# 中编写了一个 JSON 序列化/反序列化类

    private static JavaScriptSerializer js = new JavaScriptSerializer();

    public static T LoadFromJSONString<T>(string strRequest)
    {
        return js.Deserialize<T>(strRequest);
    }

    public static string DumpToJSONString<T>(T rq)
    {
        return js.Serialize(rq);
    }

它在 C# 中运行良好。现在我正在尝试转换或至少在 Java 中编写另一个 JSON 序列化/反序列化类。我试过 flexjsongoogle-gson 但我不知道如何在 Java 中指定

有人可以帮我吗?顺便说一句,我更喜欢 google-gson

【问题讨论】:

    标签: java json serialization gson deserialization


    【解决方案1】:

    在 Java 中,您必须传递实际的类型擦除类,而不仅仅是类型参数,因此数据绑定器知道要使用什么类型;就像这样:

    public static T LoadFromJSONString<T>(string strRequest, Class<T> type)
    {
        Gson gson = new Gson();
        return gson.fromJson(strRequest, type);
    }
    

    但这通常只是反序列化所需要的;序列化时,您有一个实例,其中包含库可以使用的类。

    顺便说一句,您可能要考虑使用的另一个好的 Java JSON 库是Jackson;但是,对于这个特定示例,您提到的所有库都应该可以工作。

    【讨论】:

    • 嗯,但是假设我只有类信息作为字符串,例如String clazz = "com.example.Response",那么我该如何使用这段代码呢?
    • 您可以使用 Class.forName("com.example.Response") 找到它。
    • 是的,我已经尝试过了。但问题是,当我使用Class.forName() 时,返回类型必须是Object 而不是Response,我必须这样清楚地声明:Response rp = (Response) LoadFromJSONString(resString, Class.forName("com.example.Response"))
    • 既然 Class.forName() 返回一个 Class>,你确实需要做一些转换;但是虽然丑陋,但这并不能阻止它工作。接口通常需要类型参数,以便类的显式传递(Response.class 是 Class 类型)与类型参数兼容;但拥有功能更好。所以你必须传递要绑定的类;类型参数 T 不足以让 Java 找出实际的真实类型。
    【解决方案2】:

    经过深思熟虑后,我认为没有办法像在 C# 代码中那样漂亮地解决这个问题。这是因为 java 编译器完成了类型擦除。

    对您来说最好的解决方案可能是在您知道需要序列化/反序列化的对象类型的位置使用 Gson 对象。

    如果您不热衷于每次都创建 Gson 对象的实例,那么您当然可以至少将其保持为静态,因为它在创建时不需要任何类型参数。

    【讨论】:

      【解决方案3】:

      这应该可行:

      import com.google.gson.Gson;
      public class GenericClass {
      
          private static Gson gson = new Gson(); 
      
          public static <T> T loadFromJSONString(String strRequest)
          {
              return (T) gson.fromJson(strRequest, T.class);
          }
      
          public static <T> String dumpToJSONString(T rq)
          {
              return gson.toJson(rq);
          }
      }
      

      【讨论】:

      • 嗯,等等。那是行不通的。这行导致问题:return (T) gson.fromJson(strRequest, T.class);
      猜你喜欢
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 2015-05-03
      • 1970-01-01
      相关资源
      最近更新 更多