解决fastjson泛型报错:com.alibaba.fastjson.JSONObject cannot be cast to X——使用new TypeReference

错误堆栈:

Process: com.huawei.himovie1, PID: 20329
    java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.zhangyue.group.model.bean.HolderBean
        at com.zhangyue.group.adapter.ViewHolderFactory.getItemViewType(ViewHolderFactory.java:184)
        at com.zhangyue.group.adapter.ViewHolderAdapter.getItemViewType(ViewHolderAdapter.java:64)
        at com.zhangyue.group.adapter.HeaderAndFooterAdapter.getItemViewType(HeaderAndFooterAdapter.java:96)
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5626)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5558)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5554)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2229)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1556)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1516)
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:608)
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3694)
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3411)
        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3963)
        at android.view.View.layout(View.java:16659)
        at android.view.ViewGroup.layout(ViewGroup.java:5452)


服务端返回的json 基类

public class BaseResponseBean<T> implements Serializable{
    public List<T> data;
    public Page page;
    public boolean isRestore;              // 是恢复场景的数据
    public static class Page {
        public int currentPage;            // 当前页
        public int totalPage;              // 总页数
        public int totalRecord;            // 总记录数
    }
}


具体的json对应的类

public class MyCircleResponseBean extends BaseResponseBean<MyCircleData>{
}


泛型实例类

public class MyCircleData extends CircleData {
    @Override
    public String getStyleName() {
        if(!TextUtils.isEmpty(titleDivide)){
            return ViewType.STYLE_CIRCLE_LIST_DIVIDE;
        }else {
            return ViewType.STYLE_MY_CIRCLE_LIST;
        }
    }
}


泛型实例基类

public class CircleData implements HolderBean,Serializable {
    public String id;            // 圈子id
    public String type;          // 圈子类型
    public String name;          // 圈子名称
    public String image ;          // 圈子封面
    public String fansCounText;     // 粉丝数
    public String topicCountText;    // 发言数
    public String url;           // 圈子详细地址
    //--------------------------自增字段--------------------------------
    public String titleDivide;

    @Override
    public String getStyleName() {
        return null;
    }
}


有问题的写法:

data = (BaseResponseBean) JSON.parseObject(body, MyCircleResponseBean.class);


修改之后(利用TypeReference):

data = JSON.parseObject(body, new TypeReference<BaseResponseBean<MyCircleData>>(){});

1
2
疑问:
1.有些版本 data = (BaseResponseBean) JSON.parseObject(body, MyCircleResponseBean.class); 这样写是没有问题的,泛型的集合能够解析,但是我这个版本解析不了。只能修改了。

花了一下午去研究阿里的bug ,觉得有点不值当。所以索引不管了。
2. 这里 不能写data = JSON.parseObject(body, new TypeReference<MyCircleResponseBean >(){});
因为MyCircleResponseBean 里面没有用到泛型,所以这样写解析的还是错误的。

总结:
引用第三方库就是这点不好,有了问题,你有改不了。还不如自己写的自在呦。


————————————————
原文链接:https://blog.csdn.net/u013270444/article/details/91555489

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值