解决 fastjson 泛型报错 : java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to X
错误堆栈:Process: com.huawei.himovie1, PID: 20329java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.zhangyue.group.model.bean.HolderBeanat com.zhangyue.grou...
·
错误堆栈:
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);
修改之后:
data = JSON.parseObject(body, new TypeReference<BaseResponseBean<MyCircleData>>(){});
疑问:
1.有些版本 data = (BaseResponseBean) JSON.parseObject(body, MyCircleResponseBean.class); 这样写是没有问题的,泛型的集合能够解析,但是我这个版本解析不了。只能修改了。
花了一下午去研究阿里的bug ,觉得有点不值当。所以索引不管了。
2. 这里 不能写data = JSON.parseObject(body, new TypeReference<MyCircleResponseBean >(){});
因为MyCircleResponseBean 里面没有用到泛型,所以这样写解析的还是错误的。
总结:
引用第三方库就是这点不好,有了问题,你有改不了。还不如自己写的自在呦。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)