我希望在我的Service对象中包含一个从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;
}
}
但是由于类型擦除,运行时无法使用{in new TypeToken<List<T>>() {}.getType();
中的T:因此,Gson不会返回我的实体列表,而是返回一个Gson Map对象列表。
注意,通过调用getClazz(),我确实可以在运行时访问T的具体类。虽然我不确定如何使用它来指示Gson将某个类型的列表发回给我。
有没有人知道如何让它发挥作用?
任何帮助都将不胜感激。
答案 0 :(得分:0)
解决了这个问题。
根据gson docs here,您需要将字符串拆分为单独的元素,并单独对其进行反序列化。
“使用Gson的解析器API(低级流解析器或DOM解析器JsonParser)来解析数组元素,然后在每个数组元素上使用Gson.fromJson()。这是首选方法。这是一个{ {3}}演示如何执行此操作。“
所以我的解决方案变成了:
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;
}
}