如何在不传入 Retrofit 实例的情况下使用 Retrofit 的 GsonConverter

How to use Retrofit's GsonConverter without passing-in an instance of Retrofit

我目前正在开发 Retrofit2 客户端的错误处理部分(使用 Retrofit 的 Rx 实现)。

找了一段时间,没找到简单的方法将Retrofit返回的ResponseBody反序列化到我报错的POJO中

我很想使用 one of the json converters supported by Retrofit 但他们每个人都需要传入一个实际 Retrofit 的实例 class,这在我的 onError() 回调中似乎不可用。

有没有办法从 "onError()" 回调中提供 "retrofit"?或者更好的是,有没有办法在不提供反序列化的情况下进行反序列化?我不明白为什么需要这个。

如果不是,是我的设计不好吗?

提供了一种摆脱它的方法,但它对我不起作用,我想它已经过时了。

使用 warkaround 访问 retrofit instant,我不想要那个。

否则,其他帖子建议使用他们自己的解析器,我真的不需要那个。

api.login(email, password)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer<LoginResponse>() {
        @Override
        public void onSubscribe(@NonNull Disposable d) {
            // Nothing to do
        }

        @Override
        public void onNext(@NonNull LoginResponse loginResponse) {
            // Normal use case with 2xx http status
        }

        @Override
        public void onError(@NonNull Throwable e) {
            // non-2xx http status handled here
            // This is what I tried
            if (e instanceof HttpException) {
                HttpException exception = (HttpException) e;
                Response response = exception.response();
                Converter<ResponseBody, LoginError> converter = GsonConverterFactory.create()                                      
                    .responseBodyConverter(LoginError.class, new Annotation[0], retrofit); //<--- How can I provide "retrofit" here ?
                LoginError error = converter.convert(response.errorBody());
            }
        }

        @Override
        public void onComplete() {
           // Nothing to do
        }
});

我只需要使用 Gson.fromJson(),而不是 GsonConverter.responseBodyConverter()

我使用 response.errorBody().toString() 获取要反序列化的 JSON 字符串。

return new Gson().fromJson(response.errorBody().string(), LoginError.class);

感谢 CommonsWare 指出这一点。