Обработка динамического JSON в Retrofit2

186
02 июня 2018, 14:40

Имеется метод в сервисе:

@DELETE("api/rest/dir/{dir_path}/")
Call<BaseResponse> delete(@Path("dir_path") String dirPath);

В виде ответа могут придти разные JSON.

{
"dir": { "status": "success" }
}

или

{
"dir": {
"error_code": "{error number}",
"error_message": "{description or error}"
}
}

Соответственно имеются классы:

public class BaseResponse {
}

public class Error extends BaseResponse {
@SerializedName("error_code")
private int errorCode;
@SerializedName("error_message")
private String errorMessage;


public class Status extends BaseResponse {
@SerializedName("status")
private String status;

Как правильно обрабатывать ответы? А то всегда в response находится BaseResponse и не приводится ни к одному из двух наследующих его типов.

Answer 1

Классы менять не нужно, класс остаётся один и тот же, только в случае успешного ответа в status возвращается success, а ваши error будут null, и наоборот в случае ответа с ошибкой - status == null, а в error будут данные:

public class AwesomeResponse extends ErrorResponse {
    @Nullable
    @SerializedName("status")
    public String status;
    // сколько угодно полей
}
public class ErrorResponse {
    @Nullable
    @SerializedName("error_code")
    public Integer errorCode;
    @Nullable
    @SerializedName("error_message")
    public String errorMessage;
}
READ ALSO
Java.TableView.Как включить выделение строк

Java.TableView.Как включить выделение строк

Как включить выделение строк в TableViewПри нажатии мышкой на строку она не выделяется

138
Как и чем парсить Json на Java?

Как и чем парсить Json на Java?

Часто возникает потребность работы с Json, в частности его чтения и парсингаВ Java обычно ты знаешь с каким типом переменных работаешь, а при...

222
Google calendar api для работы только со своим акаунтов

Google calendar api для работы только со своим акаунтов

Можно ли сразу настроить авторизацию чтобы не запрашивать авторизацию в пользователей, а создавать календари, события на своем аккаунте?

170
Как сравнивать значение в методе?

Как сравнивать значение в методе?

Не понятно каким образом сравнивать значение зарплаты в методе

198