如何在不传入 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 指出这一点。
我目前正在开发 Retrofit2 客户端的错误处理部分(使用 Retrofit 的 Rx 实现)。
找了一段时间,没找到简单的方法将Retrofit返回的ResponseBody反序列化到我报错的POJO中
我很想使用 one of the json converters supported by Retrofit 但他们每个人都需要传入一个实际 Retrofit 的实例 class,这在我的 onError() 回调中似乎不可用。
有没有办法从 "onError()" 回调中提供 "retrofit"?或者更好的是,有没有办法在不提供反序列化的情况下进行反序列化?我不明白为什么需要这个。
如果不是,是我的设计不好吗?
否则,其他帖子建议使用他们自己的解析器,我真的不需要那个。
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 指出这一点。