前言:
目前开发,将List<T>
转换为JSON字符串后,然后使用fastjson的JSONObject.parseObject(data, List.class)
将JSON字符串转换回List<T>
使用会报错,但是List.class部分又无法定义泛型,现出具转换方法。
场景
User user1 = new User();
User user2 = new User();
List<User> users = new Arraylist<>();
users.add(user1);
users.add(user2);
//利用fastjson将users转换为json字符串
String usersStr = JSON.toJSONString(users);
/*
* 普通将json字符串还原
* 这种方式无法定义返回格式为List<User>,如果此时将以下还原的list强转
* List<User>会报错。java.lang.ClassCastException转型错误。
*/
List list = JSONObject.parseObject(usersStr,List.class);
解决方式
fastjson提供了TypeReference这个类,对进行序列化的反序列化,使用TypeReference可以明确的指定反序列化的类型
List<Users> list = JSONObject.parseObject(usersStr,new TypeReference<List<Users>>(){});
解读
查看TypeReference源码的构造函数
核心方法:getActualTypeArguments,该方法在高级反射用于实例化泛型bean中使用过,作用是获取父类泛型类型。
其中ParameterizedType是一个记录类型泛型的接口, 继承自Type,一共三方法:
(1)返回泛型类型数组: Type[] getActualTypeArguments();
(2)返回原始类型Type: Type getRawType();
(3)返回 Type 对象,表示此类型是其成员之一的类型: Type getOwnerType();
结尾
本次牵扯到getActualTypeArguments和ParameterizedType为高级反射中内容,在泛型中用处很大,具体其他用处在后续博客中会进行更新。