使用Gson的generics类型

我正在尝试创建一个与Google Gson一起使用的generics类。 我已经创建了类GsonJsonConverterImplementation 。 该类有以下方法:

 public T deserialize(String jsonString) { GsonBuilder builder = new GsonBuilder(); builder.setDateFormat("MM/dd/yy HH:mm:ss"); Gson gson = builder.create(); return gson.fromJson(jsonString, T); // T.class etc. what goes here } 

目标是这个方法应该能够使用我设置我的GsonJsonConverterImplementation来处理的任何类型。 不幸的是, gson.fromJson(jsonString, T)不起作用,也没有使用T.class代替T.我确信这个问题源于我对Javagenerics类型缺乏了解。 在Gson中使用generics的正确方法是什么?

编辑
使用Kris的答案我会认为这应该有效。 不幸的是,clazz不能以这种方式使用并导致编译器错误。 使用Gson的集合和generics类型有哪些选择?

 public List deserializeList(String jsonString, Class clazz) { GsonBuilder builder = new GsonBuilder(); builder.setDateFormat("MM/dd/yy HH:mm:ss"); Gson gson = builder.create(); Type listType = new TypeToken(){}.getType(); // compiler error return gson.fromJson(jsonString, listType); } 

您尝试的最简单的方法是定义要在方法签名本身中返回的类的类型。 您可以通过将’T’实例传递给方法或将要返回的值的Class传递给方法来实现。 第二种方法是在您希望生成返回值的情况下更典型。 以下是使用Gson的这种方法的示例:

 public  T deserialize(String jsonString, Class clazz) { GsonBuilder builder = new GsonBuilder(); builder.setDateFormat("MM/dd/yy HH:mm:ss"); Gson gson = builder.create(); return gson.fromJson(jsonString, clazz); } 

用法:

 MyClass mc = deserialize(jsonString, MyClass.class); 

为了获得List的运行时类型,给定List的类,它会很糟糕,因为JDK认为我们不需要它,所以没有支持。 你可以inheritanceParameterizedType ,但它真的很糟糕。

  Type typeListT = new ParameterizedType() { public Type[] getActualTypeArguments() { return new Type[]{clazz}; } public Type getRawType() { return List.class; } public Type getOwnerType() { return null; } public boolean equals(Object obj) { // must implement equals per spec. this sucks } public int hashCode() { // this blows! Java forgot to specific it! // since we override equals, we should override hashCode // we have no idea what value should be returned here! // note we are co-existing with other ParameterizedType impls } }; 

我正在使用这些方法使用GSON读写Object。

 public static  void saveAnyTypeOfObject(String key, T value){ Gson gson = new Gson(); String json = gson.toJson(value); SharedPref.save(key, json); } //Type listType = new TypeToken(){}.getType(); public static  T readAnyTypeOfObject(String key, Type tt) { Gson gson = new Gson(); String json = SharedPref.read(key, "{}"); T obj = gson.fromJson(json, tt); return obj; } 

读它就像

  TypeToken typeToken= new TypeToken() {}; YourClassName yourClassName = ListSharedPref.readAnyTypeOfObject("keyForSavingClass", typeToken.getType()); 

并保存它

 YourClassName yourClassName = gson.fromJson(objJsonObject.toString(),YourClassName.class); ListSharedPref.saveAnyTypeOfObject("keyForSavingClass",yourClassName);