当我在泛型方法中有一个列表时,Gson返回一个Object列表而不是泛型类型列表。 我已经看到很多线程没有解决方案,如果我不使用泛型方法则必须为每个bean创建一个方法。
有没有人知道我该怎么做才能解决它?
PS:有一段时间我已经在列表中创建了循环,逐个实体序列化,拆分返回的String并逐个实体反序列化,但显然它是一个解决方法创建通用列表并序列化为JSON(这是一种Web服务方法):
public String listEntity(String nomeClasse) throws WsException {
// Identifying the entity class
Class<?> clazz = Class.forName(nomeClasse);
// Querying with Hibernate
List<?> lst = getDao().listEntity(clazz);
// Check if is null
if (lst == null) {
return "[]";
}
return gson.toJson(lst);
}
使用Webservice方法:
public <T> List<T> listEntity(Class<T> clazz)
throws WsIntegracaoException {
try {
// Consuming remote method
String strJson = getService().listEntity(clazz.getName());
Type type = new TypeToken<List<T>>() {}.getType();
// HERE IS THE PROBLEM
List<T> lst = GSON.fromJson(strJson, type);
// RETURNS IS A LIST OF OBJECT INSTEAD OF A LIST OF <T>
return lst;
} catch (Exception e) {
throw new WsIntegracaoException(
"WS method error [listEntity()]", e);
}
}
调用通用方法:
List<City> list = listEntity(City.class);
// Here I get a ClassCastException
fillTable(list);
列表元素(错误):
java.lang.Object@23f6b8
例外:
java.lang.ClassCastException:java.lang.Object无法强制转换为java.io.Serializable
答案 0 :(得分:3)
解决方案 - 这是为我工作的:Gson TypeToken with dynamic ArrayList item type
public <T> List<T> listEntity(Class<T> clazz)
throws WsIntegracaoException {
try {
// Consuming remote method
String strJson = getService().listEntity(clazz.getName());
JsonParser parser = new JsonParser();
JsonArray array = parser.parse(strJson).getAsJsonArray();
List<T> lst = new ArrayList<T>();
for(final JsonElement json: array){
T entity = GSON.fromJson(json, clazz);
lst.add(entity);
}
return lst;
} catch (Exception e) {
throw new WsIntegracaoException(
"WS method error [listEntity()]", e);
}
}