获取不同类型的JSON响应Retrofit

时间:2018-06-11 09:31:44

标签: java android rest retrofit2

我有REST api,它根据同一路径的当前状态做出响应。让我们假设/api/users回复

{
  "status":200,
  "error":false,
  "users":["a","b"]
} 

如果用户已获得授权。 否则,如果用户未获得授权,则以{"status":403,"error":true,"redirect":"url"}回复。使用Retrofit为api调用定义Interface时,它需要确切类型的响应对象。

前:

@GET("users")
Call<List<User>> getUsers()

但是这里的API服务器会响应不同形状的对象。如何处理这种情况?

2 个答案:

答案 0 :(得分:2)

基于意见的回答

基类

public class BaseResponse{
    int status;
    String error;
    ...
    ...
}

成功响应类

public class SuccessResponse extends BaseResponse{
    String[] users;
    ...
    ...
}

失败响应类

public class FailureResponse extends BaseResponse{
    String redirect;
    ...
    ...
}

API接口

@GET("users")
Call<BaseResponse> getUsers()

数据到达时

if(response.code == 200)
    // Parse with SuccessResponse Class
else
    // Parse with FailureResponse class

答案 1 :(得分:0)

使用此类作为模型pojo

public class User {

@SerializedName("status")
@Expose
private int status;
@SerializedName("error")
@Expose
private String error;
@SerializedName("users")
@Expose
private String users;

public int getStatus() {
    return status;
}

public void setStatus(int status) {
    this.status = status;
}

public String getError() {
    return error;
}

public void setError(String error) {
    this.error = error;
}

public String getUsers() {
    return users;
}

public void setUsers(String users) {
    this.users = users;
}

}

并在您的改造中将此模型称为......

Call<List<User>> res = BaseUrlClass.yourInterfaceHere().getUsers();
    res.enqueue(new Callback<List<User>>() {
        @Override
        public void onResponse(Call<List<User>> call, Response<List<User>> response) {
            int stat;
            String err,uuser;
            List<User> a = response.body();
           for(int i = 0;i<a.size;i++){
                  User u = a.get(i);
                   stat = u.getStatus();
                   err = u.getError();
                   uuser = u.getUsers();

            if(stat == 200){
                   //do this
              } else{
                    //do this
                  }
        }

        @Override
        public void onFailure(Call<List<User>> call, Throwable t) {

        }
    });