Получить типы различий JSON ответ Модернизация - PullRequest
0 голосов
/ 11 июня 2018

У меня есть REST API, которые отвечают в соответствии с текущим состоянием на том же пути.Давайте предположим, что /api/users ответ с

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

, если пользователь авторизован.Иначе, если пользователь не авторизован, он отвечает {"status":403,"error":true,"redirect":"url"}.При определении интерфейса для вызовов API с помощью Retrofit требуется точный тип объекта ответа.

Пример:

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

Но здесь сервер API отвечает различными формами объекта.Как справиться с такой ситуацией?

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

используйте этот класс в качестве вашей модели 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) {

        }
    });
0 голосов
/ 11 июня 2018

Ответ, основанный на мнениях

Базовый класс

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...