在Gson中反序列化一个通用列表 [英] Deserialise a generic list in Gson
问题描述
我想编写一个泛型函数,它用Gson
对一个泛型List进行反序列化,这里是代码:
私人< T>列表与LT; T> GetListFromFile(字符串文件名)
{
//读取文本文件
BufferedReader reader;
String data =;
尝试
{
reader = new BufferedReader(new FileReader(filename));
data = reader.readLine();
reader.close();
}
catch(FileNotFoundException ex)
{
}
catch(IOException ex ex)
{
}
if(data == null)
{
List< T> Spiel = new ArrayList< T>();
返回Spiel;
}
else
{
//使用Deserialise获取列表
Gson gson = new Gson();
列表< T> something = gson.fromJson(data,new TypeToken< List< T>>(){}。getType());
返回一些东西;
$ b 但是这段代码不起作用,结构,但不是我的类型列表
当我使用时:
列表与LT; concreteType> something = gson.fromJson(data,new TypeToken< List< T>>(){}。getType());
我工作得到 List< concreteType>
!!
但我需要一个通用函数,我该如何解决它?
问候
rubiktubik
解决方案如果没有传递实际类型的 T $ c
但是,如果你明确地通过它,你会发现你的方法是$ c>(如 Class< T>
)。可以为 List< T>
创建一个 TypeToken
,如下所示:
私人< T>列表与LT; T> GetListFromFile(String filename,Class< T> elementType){
...
TypeToken< ArrayList< T>> token = new TypeToken< ArrayList< T>>(){};
列表< T> something = gson.fromJson(data,token.getType());
...
}
另请参阅:
I want to write a generic function which deserialise a generic type List with Gson
here is the code:
private <T> List<T> GetListFromFile(String filename)
{
//Read textfile
BufferedReader reader;
String data="";
try
{
reader = new BufferedReader(new FileReader(filename));
data = reader.readLine();
reader.close();
}
catch (FileNotFoundException ex)
{
}
catch (IOException ex)
{
}
if (data == null)
{
List<T> Spiel = new ArrayList<T>();
return Spiel;
}
else
{
//get list with Deserialise
Gson gson = new Gson();
List<T> something = gson.fromJson(data, new TypeToken<List<T>>(){}.getType());
return something;
}
}
But this code is not working, i get a strange structure but not a List of my type
When i'am using:
List<concreteType> something = gson.fromJson(data, new TypeToken<List<T>>(){}.getType());
i works i get a List<concreteType>
!!
But i need a generic function, how can i fix it?
Regards
rubiktubik
解决方案 There is no way to do it without passing actual type of T
(as Class<T>
) to your method.
But if you pass it explicitly, you can create a TypeToken
for List<T>
as follows:
private <T> List<T> GetListFromFile(String filename, Class<T> elementType) {
...
TypeToken<ArrayList<T>> token = new TypeToken<ArrayList<T>>() {};
List<T> something = gson.fromJson(data, token.getType());
...
}
See also:
这篇关于在Gson中反序列化一个通用列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!