当我在泛型方法中有一个列表时,Gson 返回一个 Object 列表而不是一个泛型类型列表。 我见过很多没有解决方案的线程,如果我不使用通用方法,则必须为每个 bean 创建一个方法。
有没有人知道我必须做什么才能解决它?
PS:有一段时间我在列表中创建循环以逐个实体序列化实体,拆分返回的字符串并逐个实体反序列化实体,但显然这是一种解决方法
创建通用列表并序列化为 JSON(这是一种网络服务方法):
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
最佳答案
解决方案 - 这对我有用: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);
}
}
关于java - Gson将泛型列表反序列化为泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25143522/