【发布时间】:2017-03-27 19:33:11
【问题描述】:
我使用 retrofit 2 作为 REST 客户端,但我不知道如何反序列化 dynamic JSON response。
根据状态值(成功或失败),我们的 JSON 在result 字段中可以有两个不同的对象:
-
成功的响应返回一个
User对象:{ "status": 200, "message": "OK", "result": { "id": "1", "email": "bla@bla.bla" ... } } -
失败的响应返回一个
Error对象:{ "status": 100, "message": "FAILED", "result": { "error": "a user with this account email address already exists" } }
我创建了 3 个POJO 类...
-
API 响应:
public class APIResponse<T> { @Expose private int status; @Expose private String message; @Expose private T result; ... } -
用户:
public class User { @Expose private String id; @Expose private String email; ... } -
错误:
public class Error { @Expose private String error; ... }
这是我拨打电话的方式:
@FormUrlEncoded
@PUT(LOGIN)
Call<APIResponse<User>> login(@Field("email") String email, @Field("password") String password);
这是我得到回应的方式:
@Override
public void onResponse(Call<APIResponse<User>> call, Response<APIResponse<User>> response) {
...
}
@Override
public void onFailure(Call<APIResponse<User>> call, Throwable t) {
...
}
问题:
API call 期望返回类型为 Call<APIReponse<User>>。但是,它可能无法返回User 对象......那么我该如何修改这种方法以接受APIResponse<User> 或APIResponse<Error>。
换句话说,我如何反序列化两种不同格式的 JSON 数据?
我看过的解决方案:
- 在用户类中包含“错误”字段或扩展错误类(丑陋)。
- 自定义拦截器或转换器(难以理解)。
- 说服 API 开发人员改变它,让我的生活更轻松 :)
【问题讨论】:
-
为什么你不能尝试使用 volley
标签: android json rest retrofit2