当前位置: 首页 > 知识库问答 >
问题:

改型2 rxjava-gson-“全局”反序列化,更改响应类型

彭令秋
2023-03-14
public class ApiResponse<T> {
    public boolean success;
    public T data;
}
@GET(...)
Observable<ApiResponse<User>> getUser();
response.getData().getUserId();
@GET(...)
Observable<User> getUser();
{
  "success": true,
  "data": {
    "id": 22,
    "firstname": "Jon",
    "lastname": "Snow"
  }
}

编辑2:我已经用改型拦截器手动修改响应体来完成这个任务。它是有效的,但如果你有任何其他建议,请发布它们:)

共有1个答案

壤驷骁
2023-03-14

正如所说,用拦截器解决问题并不是很好。我已经设法用Rx变压器解决了这个问题。我还添加了自定义api异常,当出现错误时,我可以抛出该异常,并在OnError中轻松处理。我觉得它更健壮。

响应包装:

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

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

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();
            });
}
 类似资料:
  • 我有一门课是这样的: 但是当我试图序列化它时,我收到一个错误,上面写着“试图序列化java.lang.class:java.lang.字符串。忘记注册一个类型适配器了吗?”。所以我创建了这个适配器: } 并登记如下: 但我还是犯了同样的错误<我做错了什么 适配器的实现看起来正常吗?

  • 我在Android应用程序中实现Json反序列化时遇到了一些问题(带有Gson库)

  • 问题内容: 我正在使用GSON 1.4,并使用两个通用对象序列化对象,如下所示 。当我对它进行反序列化时 可悲的是我得到了 java.lang.IllegalArgumentException:无法将java.util.ArrayList字段…设置为java.util.LinkedList 这是为什么 ?GSON文档指出,如果我使用object.class参数进行序列化,则它支持泛型。任何想法?谢

  • 我有一个Api,Api如下所示: 如果响应是ok,那么结构将以关键字开头,例如: 问题是:我如何为父类创建一个反序列化器,它也会反序列化子类(作为我的第二种方法),或者我如何用Gson创建一个泛型类,这样包装在周围的每个tyoe都可以与它一起使用,比如: public class DataObjectDeserializer implements JsonDeserializer{

  • 您将获得对象(或对象列表),而不是作为传递的实际对象(或第二种情况下的实际对象列表)。 如果您想要一个仍然想要反序列化泛型类型对象(-s),请参阅下面的答案。 +红利:LoopJ+GSON的最终通用解决方案 如何获取泛型接口的具体类型 Java类型Generic作为GSON的参数

  • 问题内容: 我在Android应用程序(带有Gson库)中实现Json反序列化存在一些问题 我已经上了这样的课 反序列化的调用是: 问题是调用后的result.posts列表包含一个LinkedTreeMap对象数组(具有正确的值,因此问题是反序列化)而不是MyJson对象。当我使用MyObject而不是T时,一切运行正常并且MyObject是正确的。 那么,有什么方法可以在不创建自定义反序列化器