com.google.gson.internal.LinkedTreeMap cannot be cast to xxx

17395 ワード

問題の説明
Gson汎型解析時のJsonエラー:com.google.gson.internal.LinkedTreeMap cannot be cast to xxx
まず、返されるJsonデータフォーマットを見てみましょう.
{
    "code": 200,
    "data": [
        {
            "id": null,
            "type": "free",
            "name": "      ",
            "totals": null,
            "books": [
                {
                    "ebook_type": "0",
                    "author": "    ",
                    "isfree": "0",
                    "isbn": "9787040144390",
                    "title": "    1",
                    "type": 0,
                    "url": "http://d7.ixdzs.com/66/66746/66746.epub",
                    "download_count": 234,
                    "cover": "https://pic4.zhimg.com/017d7c47843b8816a0ab583d37628947_xld.jpg",
                    "addtime": 1493869462000,
                    "id": 4,
                    "press": "     ",
                    "introduction": "  ",
                    "likes": 1
                }
                ...
            ]
        }
    ],
    "msg": "ok",
    "app_key": null
}

次に汎用インタフェース処理クラス
public class RootBean extends BaseEntity.BaseBean {

    /**
     * code : 200
     * data : []
     * msg : ok
     * app_key : null
     */

    private int code;
    private String msg;
    private Object app_key;
    private T data;


    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getApp_key() {
        return app_key;
    }

    public void setApp_key(Object app_key) {
        this.app_key = app_key;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }


    @Override
    public String toString() {
        return "RootBean{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", app_key=" + app_key +
                ", data=" + data +
                '}';
    }
}

エラーの原因
汎用型に明確なタイプが指定されていないため、Java型消去異常が発生しました.
解決する
このインタフェースのすべてのRootBeanを使用する方法またはパラメータでTのタイプを指定します.すなわち、RootBean、Listは最終的に取り出すデータです.
関連するコードを貼り付けます.
Apiリクエスト層
  /**
     *      List
     * http://192.168.100.158/portal/app/find/recommends
     *
     * @return
     */
    @GET("find/recommends")
    Observable>> findRecommends();

Contractレイヤ
public interface FindContract {
    interface Model extends BaseModel {
        /**
         *          
         *
         * @return
         */
        ObservableList>> findRecommends();
    }

    interface View extends BaseView {
        /**
         *         
         *
         * @param rootBean
         */
        void findRecommends(RootBean<List> rootBean);

        /**
         *       
         *
         * @param e
         */
        void displayError(Throwable e);
    }

    abstract class Presenter extends BasePresenter<Model, View> {
        abstract void findRecommends();

        @Override
        public void onAttached() {

        }
    }
}

Model層
public class FindModel implements FindContract.Model {
    @Override
    public Observable>> findRecommends() {
        return ApiManager.getInstance().mApiService.findRecommends()
                .compose(RxSchedulers.>>applySchedilers());
    }
}

プレゼンタ層
public class FindPresenter extends FindContract.Presenter {
    @Override
    public void findRecommends() {
        mModel.findRecommends().subscribe(new Observer>>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                mView.displayError(e);
            }

            @Override
            public void onNext(RootBean> rootBean) {
                mView.findRecommends(rootBean);
            }
        });

    }
}

UI層
public class FindFragment extends BaseFragment implements FindContract.View {

    /*       */
    List mDataBeanList;
    List mBannersBeanList;
    List mBooksBeanList;//      
    /*        */
    private MultiTypeAdapter mAdapter;
    private Items mItems;//Items     ArrayList

    /*  */
    @BindView(R.id.rv_content)
    RecyclerView content_rv;// RecyclerView
    @BindView(R.id.swipeRefresh)
    SwipeRefreshLayout swipeRefreshLayout;//    

    public FindFragment() {
    }

    public static FindFragment newInstance() {
        FindFragment fragment = new FindFragment();
        return fragment;
    }

    @Override
    protected int getLayoutId() {
        return R.layout.fragment_find;
    }

    @Override
    protected void initView() {
        /*        */
        swipeRefreshLayout.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary,
                R.color.red);//         
        //     View     
        mAdapter = new MultiTypeAdapter();
        //   
        mAdapter.register(BannersListBean.class, new BannersViewBinder(mContext));
        //     
        mAdapter.register(HeaderBean.class, new HeaderViewBinder());
        //    
        mAdapter.register(BooksListBean.class, new BooksViewBinder(mContext));
        /*  RV    */
        LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        content_rv.setLayoutManager(layoutManager);
        content_rv.setAdapter(mAdapter);


    }

    @Override
    protected void initData() {
        swipeRefreshLayout.setRefreshing(true);//       
        mPresenter = new FindPresenter();
        mPresenter.setMV(new FindModel(), this);
        mPresenter.findRecommends();//      
    }

    @Override
    public void findRecommends(RootBean> rootBean) {
        //              ,        
        swipeRefreshLayout.setRefreshing(false);
        if (rootBean != null) {
            mBannersBeanList = new ArrayList<>();
            //       
            mBannersBeanList.add(new BannersBean("https://pic4.zhimg.com/v2-0a5e49bf27ffc7fbc13350e29408e9bf.jpg",
                    "https://www.zhihu.com/publications/book/119554452"));

            //mDataBeanList = JsonUtil.stringToArray(rootBean.getData().toString(), DataBean[].class);
            mDataBeanList = rootBean.getData();
            //      
            mItems = new Items();
            for (DataBean d : mDataBeanList) {
                //       
                if ("free".equals(d.getType())) {
                    mItems.add(new BannersListBean(mBannersBeanList));
                }
                mItems.add(new HeaderBean(d.getName()));
                mBooksBeanList = d.getBooks();
                mItems.add(new BooksListBean(mBooksBeanList));
            }
            mAdapter.setItems(mItems);
            mAdapter.notifyDataSetChanged();
        }
    }


    @Override
    public void displayError(Throwable e) {
        //              ,        
        swipeRefreshLayout.setRefreshing(false);
        Timber.tag(TAG).e(e.toString());
    }

    @Override
    protected void initEvent() {
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                mPresenter.findRecommends();

            }
        });
    } 
  

http://blog.csdn.net/anddroid_lanyan/article/details/46561341