场景描述
-
简介
使用fastjson将字符串转换成带泛型的类的对象,转换正常,当再获取转换后对象中的泛型对象集合时报错:ClassCastException
错误示例
-
PageBean泛型类
package link.lycreate.springbooteasyexceldemo.domain; import lombok.Data; import java.io.Serializable; import java.util.Collection; /** * @ClassName PageBean * @Description TODO 分页封装实体$ * @Author charlesYan * @Date 2021/6/1 15:50 * @Version 1.0 **/ @Data public class PageBean<T> implements Serializable { private static final long serialVersionUID = 7448720416569429689L; private int pageSize = 10; private int startIndex = 0; private int totalCount; private Collection<T> data; }
-
调用测试方法
@Test public void testParseObject(){ PageBean<User> userPageBean = new PageBean<>(); List<User> users = new ArrayList<>(); users.add(new User("张三",10,"镇魂街")); users.add(new User("李四",20,"灵溪宗")); userPageBean.setData(users); userPageBean.setPageSize(10); userPageBean.setStartIndex(0); userPageBean.setTotalCount(2); String json = JSONObject.toJSONString(userPageBean); System.out.println("序列化之后的json:" + json); // 敲黑板,这里是重点 PageBean<User> pageBean = JSON.parseObject(json, PageBean.class); if (null != pageBean && !pageBean.getData().isEmpty()) { for (User user : pageBean.getData()) { System.out.println(user); } // 这里如果仅仅是遍历,可以使用Stream流遍历,不会发生异常 // pageBean.getData().forEach(user -> { // System.out.println(user); // }); } }
-
报错信息
java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to link.lycreate.springbooteasyexceldemo.domain.User
-
原因分析
因为fastjson转换对象,方法是JSON.parseObject(String json,Class clazz),这个方法又没办法指定我们需要转换的具体类型比如我们想要得到的结果是PageBean, 但是因为parseObject没有指定泛型,所以实际上得到是PageBean,这里通过debug可以发现。
解决方案
-
fastjson重载方法
public static <T> T parseObject(String text, TypeReference<T> type, Feature... features){}
-
最终测试方法
PageBean<User> pageBean = JSON.parseObject(json, new TypeReference<PageBean<User>>() {});
参考链接
-
Fastjson转换json到带泛型的对象(如Map)报错解决
https://blog.csdn.net/zzzgd_666/article/details/96431040