com.google.gson.internal.LinkedTreeMap cannot be cast to xxx
17395 ワード
問題の説明
Gson汎型解析時のJsonエラー:com.google.gson.internal.LinkedTreeMap cannot be cast to xxx
まず、返されるJsonデータフォーマットを見てみましょう.
次に汎用インタフェース処理クラス
エラーの原因
汎用型に明確なタイプが指定されていないため、Java型消去異常が発生しました.
解決する
このインタフェースのすべてのRootBeanを使用する方法またはパラメータでTのタイプを指定します.すなわち、RootBean
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
- 、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