今天,我本来想对Gson做一个小小封装的,但却遇到了 Gson解析Json数组遇到的泛型类型擦除问题,下面对此做下记录。
错误的方式
// 将Json数组解析成相应的映射对象列表
public static <T> ArrayList<T> parseJsonArray(Class<T> myClass,String jsonStr)throws Exception{
return new Gson().fromJson(jsonStr,new TypeToken<ArrayList<T>>(){}.getType());
}
这样写,运行会报错 数据类型不匹配,Gson 返回的数据类型是 List<LinkedTreeMap> ,不是我们想要的 List<MyClass>。
解决方法
网上找到了两篇文章:
Gson TypeToken with dynamic ArrayList item type
Java泛型-类型擦除
解决结果
Gson gson = new Gson();
//解析 Json对象
public static <T> T parseJson(Class<T> type,String jsonStr)throws Exception{
return gson.fromJson(jsonStr,type);
}
// 将Json数组解析成相应的映射对象列表
public static <T> ArrayList<T> parseJsonArray(Class<T> myClass,String jsonStr)throws Exception{
Type type = new ListParameterizedType(myClass);
return gson.fromJson(jsonStr, type);
}
private static class ListParameterizedType implements ParameterizedType {
private Type type;
private ListParameterizedType(Type type) {
this.type = type;
}
@Override
public Type[] getActualTypeArguments() {
return new Type[] {type};
}
@Override
public Type getRawType() {
return ArrayList.class;
}
@Override
public Type getOwnerType() {
return null;
}
// implement equals method too! (as per javadoc)
}
网友评论