fastjson汎用エラーの解決:java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to X
3716 ワード
エラースタック:
サービス側が返すjsonベースクラス
具体的なjson対応クラス
汎用インスタンスクラス
汎用インスタンスベースクラス
問題のある書き方:
変更後:
質問:
1.一部のバージョンdata=(BaseResponseBean)JSON.parseObject(body, MyCircleResponseBean.class); このように書くのは問題なく、汎用的な集合は解析できますが、私のこのバージョンでは解析できません.修正するしかない.
午後アリのバグを研究するのに費やしたが、少し値打ちがないと思った.だからインデックスは放っておいた.2.ここでdata=JSONは書けません.parseObject(body, new TypeReference(){}); MyCircleResponseBeanには汎用型が使われていないので、このように解析を書くのは間違いです.
まとめ:
サードパーティのライブラリを引用するのはこれが悪いので、問題があったら、あなたは変えられません.自分で書いたほうが自在だよ.
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 implements Serializable{
public List 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{
}
汎用インスタンスクラス
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>(){});
質問:
1.一部のバージョンdata=(BaseResponseBean)JSON.parseObject(body, MyCircleResponseBean.class); このように書くのは問題なく、汎用的な集合は解析できますが、私のこのバージョンでは解析できません.修正するしかない.
午後アリのバグを研究するのに費やしたが、少し値打ちがないと思った.だからインデックスは放っておいた.2.ここでdata=JSONは書けません.parseObject(body, new TypeReference(){}); MyCircleResponseBeanには汎用型が使われていないので、このように解析を書くのは間違いです.
まとめ:
サードパーティのライブラリを引用するのはこれが悪いので、問題があったら、あなたは変えられません.自分で書いたほうが自在だよ.