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&lt;Response&lt;LoginDataModel&gt;&gt; 吗? 【参考方案1】:

请更改 ApiInterface

@POST("login/")
Observable<Response<LoginDataModel>> login(@Body LoginParamModel model);

【讨论】:

以上是关于java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 ClassName的主要内容,如果未能解决你的问题,请参考以下文章