Как обрабатывать динамический JSON с помощью Retrofit 2?

У меня есть 2 типа ответа для одного URL. Первый — это список объектов, а второй — объект ответа на ошибку.

Первый:

[
    {
       id: 1,
       title: "title1",
       description: "",
       position: 1000
    },

    {
       id: 2,
       title: "title3",
       description: "",
       position: 1000
    },

    {
       id: 3,
       title: "title3",
       description: "",
       position: 1000
    }
 ]

Второй:

{
   "status":"error",
   "error":"no token"
}

Любые идеи, как справиться с этим с помощью Retrofit 2? Когда сервер возвращает ответ об ошибке, у меня возникает ошибка: «Ожидается BEGIN_ARRAY, но был BEGIN_OBJECT в строке 1, столбце 2, пути $»

Категория.класс

public class Category{

    @SerializedName("id")
    @Expose
    private Id id;
    @SerializedName("title")
    @Expose
    private String title;
    @SerializedName("description")
    @Expose
    private String description;
    @SerializedName("position")
    @Expose
    private Integer position;


    /**
     *
     * @return
     * The id
     */
    public Id getId() {
        return id;
    }

    /**
     *
     * @param id
     * The id
     */
    public void setId(Id id) {
        this.id = id;
    }

    /**
     *
     * @return
     * The title
     */
    public String getTitle() {
        return title;
    }

    /**
     *
     * @param title
     * The title
     */
    public void setTitle(String title) {
        this.title = title;
    }

    /**
     *
     * @return
     * The description
     */
    public String getDescription() {
        return description;
    }

    /**
     *
     * @param description
     * The description
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     *
     * @return
     * The position
     */
    public Integer getPosition() {
        return position;
    }

    /**
     *
     * @param position
     * The position
     */
    public void setPosition(Integer position) {
        this.position = position;
    }



}

Запрос к серверу:

 public void loadCategories(final boolean pullToRefresh) {

        Call<List<Category>> categoriesCall = mRequestHandler.getCategories(Keys.CATEGORY_CATALOGS);

        categoriesCall.enqueue(new Callback<List<Category>>() {
            @Override
            public void onResponse(Call<List<Category>> call, Response<List<Category>> response) {

                if (response.isSuccess()) {
                    getView().setData(response.body());
                }
            }

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

                getView().showError(null, pullToRefresh);
                Log.e("Error:", t.getMessage());

            }

        });


    }

person user3785567    schedule 13.04.2016    source источник
comment
Можете ли вы опубликовать свой код?   -  person Nguyễn Trung Hiếu    schedule 14.04.2016
comment
Используйте объект ответа оболочки, в котором будет находиться ваш массив, а также свойства ошибки. Любой из них будет нулевым, проверьте его, чтобы увидеть, какой ответ вы получили. В верхней части головы я не знаю, возможно ли использовать массив и объект одновременно с ответом   -  person Patrick Favre    schedule 14.04.2016
comment
Исправьте свой сервер. Ответ не может быть массивом или объектом. В противном случае вам придется обойтись без модернизации и вручную проанализировать ваши объекты и поймать это исключение.   -  person OneCricketeer    schedule 14.04.2016


Ответы (1)


я вижу, что ваш сервер отправляет ошибку HTTP_STATUS 200. Вот почему модификация рассматривает это как ответ, а не как ошибку. внесение этого изменения на стороне сервера приведет к вызову public void onFailure(Call> call, Throwable t).

person Chandan Bhandari    schedule 18.08.2017