Java学习之fastjson反序列化带泛型的类异常处理

Java学习之fastjson反序列化带泛型的类异常处理

场景描述

  • 简介

    使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值