gpt4 book ai didi

android - Retrofit 2 RxJava - Gson - "Global"反序列化,改变响应类型

转载 作者:太空宇宙 更新时间:2023-11-03 12:16:27 25 4
gpt4 key购买 nike

我使用的 API 总是返回如下所示的 JSON 对象:

public class ApiResponse<T> {
public boolean success;
public T data;
}

data 字段是一个 JSON 对象,包含所有有值(value)的信息。当然对于不同的要求是不同的。所以我的改造界面是这样的:

@GET(...)
Observable<ApiResponse<User>> getUser();

当我想处理响应时,我需要做例如:

response.getData().getUserId();

我真的不需要那个 boolean success 字段,我想省略它,这样我的改造界面看起来像这样:

@GET(...)
Observable<User> getUser();

在 Gson 中可以这样做吗?或者也许是一个简洁的 Rx 函数可以自动转换它?

编辑:示例 json:

{
"success": true,
"data": {
"id": 22,
"firstname": "Jon",
"lastname": "Snow"
}
}

编辑 2:我已经使用改造拦截器手动修改响应正文来做到这一点。它有效,但如果您有任何其他建议,请发布它们:)

最佳答案

正如 Than 所说,拦截器的解决方案并不是很好。我已经设法用 Rx 变压器解决了这个问题。我还添加了自定义 api 异常,当出现问题时我可以抛出该异常并在 onError 中轻松处理它。我认为它更强大。

响应包装器:

public class ApiResponse<T> {
private boolean success;
private T data;
private ApiError error;
}

成功为假时返回的错误对象:

public class ApiError {
private int code;
}

成功为假时抛出异常:

public class ApiException extends RuntimeException {
private final ApiError apiError;
private final transient ApiResponse<?> response;

public ApiException(ApiResponse<?> response) {
this.apiError = response.getError();
this.response = response;
}

public ApiError getApiError() {
return apiError;
}

public ApiResponse<?> getResponse() {
return response;
}
}

还有一个变压器:

protected <T> Observable.Transformer<ApiResponse<T>, T> applySchedulersAndExtractData() {
return observable -> observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map(tApiResponse -> {
if (!tApiResponse.isSuccess())
throw new ApiException(tApiResponse);
else
return tApiResponse.getData();
});
}

关于android - Retrofit 2 RxJava - Gson - "Global"反序列化,改变响应类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34288873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com