今天在尝试用泛型写json解析方法的时候出现了问题,看错误信息就是‘类型’转换问题。调试断点,果然发现这LinkedTreeMap有点不同,如下:
如果代码这样写:
public static <T> List<T> jsonToDto(String message, String jsonHead,T t){//这里是用的T
JsonObject jsonObject = new JsonParser().parse(message).getAsJsonObject();
JsonArray jsonArray = jsonObject.getAsJsonArray(jsonHead);
Gson gson = builder.create();
List<T> list = new ArrayList<>();
for (JsonElement jsonElement : jsonArray) {
t = gson.fromJson(jsonElement,new TypeToken<T>(){}.getType()); // TypeToken
list.add(t);
}
return list;
}
对应的结果如下:
如果这样写:
public static <T> List<T> jsonToDto(String message, String jsonHead,Class<T> cls){ //这里是Class<T>
JsonObject jsonObject = new JsonParser().parse(message).getAsJsonObject();
JsonArray jsonArray = jsonObject.getAsJsonArray(jsonHead);
Gson gson = builder.create();
List<T> list = new ArrayList<>();
for (JsonElement jsonElement : jsonArray) {
list.add(gson.fromJson(jsonElement,cls)); //cls
}
return list;
}
对应的结果如下:
可以看出两种方法解析的结果的结构是不一样的,让我们来看一看下图:
有两个方法对应我上述两段代码,返回类型都是T,当使用第一种方法时返回的是LinkedTreeMap,所以当我把解析后的集合遍历赋值给JavaBean的时候就会报“类型”转换错误的异常。解决方法就是使用第二种方法。或者参考LinkedTreeMap的处理方法
for (TestBean bean : list) {
....
}