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

标签 android json gson retrofit rx-java

我使用的 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/

相关文章:

java - 编码时 Jettison/String 以整数形式返回

java - 如何使用 GSON 反序列化 PHP 数组

android - 如何在android中访问本地服务器上的文件?

java - 谁能帮我找到一种方法来将新用户(新注册)的字段显示到 Android Studio 应用程序的 Activity 中?

java - 如何在restful中将map转换为json

java - 过滤Json数组

java - ListView.refresh() 不起作用

java - 泛型类型上的 GSON(Java 集合)

android - 在 android.support.annotation 中找不到 RequiresApi

java - 我怎样才能在android中显示这样的符号?