2014-01-17 99 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; 
    } 
}