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