Java 获取不同类型的JSON响应更新

Java 获取不同类型的JSON响应更新,java,android,rest,retrofit2,Java,Android,Rest,Retrofit2,我有RESTAPI,它根据同一路径上的当前状态进行响应。让我们假设/api/users响应为 { "status":200, "error":false, "users":["a","b"] } 如果用户被授权。 否则,如果用户未被授权,它将响应{“status”:403,“error”:true,“redirect”:“url”}。在为带有改型的api调用定义接口时,它需要响应对象的确切类型 例: @GET(“用户”) 调用getUsers() 但在这里,API服务器使用不同

我有RESTAPI,它根据同一路径上的当前状态进行响应。让我们假设
/api/users
响应为

{
  "status":200,
  "error":false,
  "users":["a","b"]
} 
如果用户被授权。 否则,如果用户未被授权,它将响应
{“status”:403,“error”:true,“redirect”:“url”}
。在为带有改型的api调用定义接口时,它需要响应对象的确切类型

例:

@GET(“用户”)
调用getUsers()

但在这里,API服务器使用不同形状的对象进行响应。如何处理这种情况?

基于意见的答案

基层

public class BaseResponse{
    int status;
    String error;
    ...
    ...
}
成功回应班

public class SuccessResponse extends BaseResponse{
    String[] users;
    ...
    ...
}
public class FailureResponse extends BaseResponse{
    String redirect;
    ...
    ...
}
故障响应类

public class SuccessResponse extends BaseResponse{
    String[] users;
    ...
    ...
}
public class FailureResponse extends BaseResponse{
    String redirect;
    ...
    ...
}
API接口

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

基于意见的答案

基层

public class BaseResponse{
    int status;
    String error;
    ...
    ...
}
成功回应班

public class SuccessResponse extends BaseResponse{
    String[] users;
    ...
    ...
}
public class FailureResponse extends BaseResponse{
    String redirect;
    ...
    ...
}
故障响应类

public class SuccessResponse extends BaseResponse{
    String[] users;
    ...
    ...
}
public class FailureResponse extends BaseResponse{
    String redirect;
    ...
    ...
}
API接口

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

将此类用作模型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) {

        }
    });
调用res=BaseUrlClass.yourInterfaceHere().getUsers(); res.enqueue(新回调(){ @凌驾 公共void onResponse(调用、响应){ int stat; 字符串错误,uuser; List a=response.body();
对于(inti=0;i使用这个类作为您的模型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) {

        }
    });
调用res=BaseUrlClass.yourInterfaceHere().getUsers(); res.enqueue(新回调(){ @凌驾 公共void onResponse(调用、响应){ int stat; 字符串错误,uuser; List a=response.body();
对于(int i=0;i创建一个由成功响应类和失败响应类扩展的基类。在API接口中使用基类。当实际响应出现时,检查错误代码并进行相应分析。创建一个由成功响应类和失败响应类扩展的基类。在API接口中使用基类。当实际l响应,然后检查错误代码并进行相应解析。但是如何从用户类获取“重定向”:“url”。这不是用户的属性。您可以发布json吗?请查看问题。
{“状态”:403,“错误”:true,“重定向”:“url”}
这是另一个响应。但是如何获取“重定向”:“url”来自用户类。它不是User的属性。你可以发布你的json吗?请查看问题。
{“status”:403,“error”:true,“redirect”:“url”}
这是另一个回答。