2014-01-17 98 views
0

我想在我的Service对象中包含反序列化来自json字符串的对象列表的通用方法。将json字符串反序列化为一般类型列表

下面是我的第一次尝试。

public abstract class AbstractService<T>{ 

    public abstract Class<T> getClazz(); 

    public List<T> deserialize(final String json){ 
     Gson gson = gsonFactory.create(); 
     Type listType = new TypeToken<List<T>>() {}.getType(); 
     List<T> entityList = gson.fromJson(json, listType); 
     return entityList; 
    } 
} 

但是由于类型擦除,在运行时,T:new TypeToken<List<T>>() {}.getType();不可用。因此,Gson不是返回我的实体列表,而是返回一个Gson Map对象列表。

请注意,通过调用getClazz(),我可以在运行时访问具体的T类。虽然我不确定如何使用它来指示Gson发送给我一个特定类型的列表。

有没有人知道让这个工作的方式?

任何帮助,将不胜感激。

+0

也许传递参数? –

回答

0

解决了它。

根据gson文档here,您需要将字符串拆分为单独的元素,并将这些字符串反序列化。 “

”使用Gson的解析器API(低级流解析器或DOM解析器JsonParser)解析数组元素,然后在每个数组元素上使用Gson.fromJson(),这是首选方法。演示如何做到这一点的example。“

所以我的解决方案变为:

public abstract class AbstractService<T>{ 

    public abstract Class<T> getClazz(); 

    public List<T> deserialize(final String json){ 
     JsonArray array = parser.parse(json).getAsJsonArray(); 
     final List<T> entityList = new ArrayList<V>(); 
     for(final JsonElement jsonElement: array){ 
      T entity = gson.fromJson(jsonElement, getClazz()); 
      entityList.add(entity); 
     } 
     return entityList; 
    } 
}