我正在尝试创建一个用于Google Gson的泛型类。我创建了课程GsonJsonConverterImplementation<T>
。该类有以下方法:
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.我确信问题源于我对Java泛型类型缺乏了解。在Gson中使用泛型的正确方法是什么?
修改
使用Kris's answer我会认为这应该有效。不幸的是,clazz不能以这种方式使用并导致编译器错误。使用Gson处理集合和泛型类型有哪些选择?
public List<T> deserializeList(String jsonString, Class<T> clazz) {
GsonBuilder builder = new GsonBuilder();
builder.setDateFormat("MM/dd/yy HH:mm:ss");
Gson gson = builder.create();
Type listType = new TypeToken<clazz>(){}.getType(); // compiler error
return gson.fromJson(jsonString, listType);
}
答案 0 :(得分:36)
您尝试的最简单的方法是定义要在方法签名本身中返回的类的类型。您可以通过将'T'实例传递给方法或将要返回的值的Class传递给它。第二种方法是在您希望生成返回值的情况下更典型。以下是使用Gson的这种方法的示例:
public <T> T deserialize(String jsonString, Class<T> 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);
答案 1 :(得分:5)
要获得List<T>
的运行时类型,给定类T
,它会很糟糕,因为JDK认为我们不需要它,因此没有支持。你可以继承ParameterizedType
,但它真的很糟糕。
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
}
};
答案 2 :(得分:1)
我正在使用这些方法阅读&amp;使用GSON编写Object。
public static <T> void saveAnyTypeOfObject(String key, T value){
Gson gson = new Gson();
String json = gson.toJson(value);
SharedPref.save(key, json);
}
//Type listType = new TypeToken<YourClass>(){}.getType();
public static <T> T readAnyTypeOfObject(String key, Type tt) {
Gson gson = new Gson();
String json = SharedPref.read(key, "{}");
T obj = gson.fromJson(json, tt);
return obj;
}
阅读
TypeToken<YourClassName> typeToken= new TypeToken<YourClassName>() {};
YourClassName yourClassName = ListSharedPref.readAnyTypeOfObject("keyForSavingClass", typeToken.getType());
并保存
YourClassName yourClassName = gson.fromJson(objJsonObject.toString(),YourClassName.class);
ListSharedPref.saveAnyTypeOfObject("keyForSavingClass",yourClassName);