java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 ClassName
Posted
技术标签:
【中文标题】java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 ClassName【英文标题】:java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to ClassName 【发布时间】:2020-05-03 08:36:54 【问题描述】:我曾经使用retrofit和rxjava处理带有o的Api的两个响应的Api。我正在创建响应模型和错误模型。 我不知道如何在一个 Api 中处理这两种响应,这是我的实现
@POST("login/")
Observable<Response<Object>> login(@Body LoginParamModel model);
这是我的 api 实现
RetroClient.getClient(ApiEndPointInterface.URl).create(ApiEndPointInterface.class)
.login(model).subscribeOn(Schedulers.computation())
.observeOn(androidSchedulers.mainThread())
.subscribe(new Observer<Response<Object>>()
@Override
public void onSubscribe(Disposable d)
@Override
public void onNext(Response<Object> loginDataModelResponse)
mLoginDataModelResponse=loginDataModelResponse;
@Override
public void onError(Throwable e)
mLoginView.LoginError(e.getMessage());
@Override
public void onComplete()
if (mLoginDataModelResponse.code() == 200 || mLoginDataModelResponse.code() == 201)
LoginDataModel loginDataModel = (LoginDataModel) mLoginDataModelResponse.body();
mLoginView.LoginResult(loginDataModel);
else if (mLoginDataModelResponse.code() == 400)
try
mLoginView.LoginError(CommonUtill.JsonReader(mLoginDataModelResponse.errorBody().string()));
catch (IOException e)
e.printStackTrace();
);
我取得了成功,但问题是我没有将对象类转换为模型类
LoginDataModel loginDataModel = (LoginDataModel) mLoginDataModelResponse.body();
我遇到了这种类型的异常:
W:io.reactivex.exceptions.UndeliverableException:无法将异常传递给消费者,因为它已经取消/处置了流程,或者异常无处可去。进一步阅读:https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling | java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 com.model.login.LoginDataModel
W:原因:java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 com.model.login.LoginDataModel
LoginDataModel 是我的 Api 响应模型类,这里是 RetroClientClass
public class RetroClient
private static Retrofit retrofit = null;
private Context mContext;
public static Retrofit getClient(String BaseUrl)
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.level(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient
.Builder()
.addInterceptor(new Interceptor()
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException
String token = CommonUtill.ACCESS_TOKEN;
Request request = chain.request();
request = request.newBuilder()
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.addHeader("Authorization", "Bearer " + token)
.addHeader("X-TOKEN-AUTHENTICATION", "True")
.build();
return chain.proceed(request);
)
.readTimeout(10, TimeUnit.SECONDS)
.connectTimeout(30, TimeUnit.SECONDS)
.addInterceptor(interceptor)
.build();
if (retrofit == null)
retrofit = new Retrofit.Builder()
.baseUrl(BaseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
return retrofit;
【问题讨论】:
ApiEndPointInterface
是如何定义的。您是否设置了 RxJava 适配器:github.com/square/retrofit/tree/master/retrofit-adapters/…?
@akarnokd 请检查更新后的代码
你试过Observable<Response<LoginDataModel>>
吗?
【参考方案1】:
请更改 ApiInterface
@POST("login/")
Observable<Response<LoginDataModel>> login(@Body LoginParamModel model);
【讨论】:
以上是关于java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 ClassName的主要内容,如果未能解决你的问题,请参考以下文章