Ожидаемый BEGIN_ARRAY, но был BEGIN_OBJECT в пути строки 1 столбца 2, несмотря на правильность JSON - PullRequest
0 голосов
/ 10 октября 2019

Я просмотрел все другие разделы, посвященные этому описанию, и у них почти всегда есть тот же недостаток в вызываемом JSON, который заключается в том, что JSON содержит только один объект, а не массив. Я позаботился об этом, ниже вы можете увидеть JSON, который возвращается после того, как запрос выполнен в Postman.

Я исчерпал свой поиск решения, так как каждое онлайн решение включает в себя преобразование JSON вмассив, как я уже сделал. Я нашел в Интернете учебник о том, как вызывать список с использованием модернизации (Call<List<Object>>), и он использует почти идентичный моему коду код, и JSON находится в том же формате, поэтому я считаю, что мой JSON верен

Сначалавозвращаемый JSON:

[
  {
    "is_active": 1,
    "match_date": "Wed, 09 Oct 2019 13:53:27 GMT",
    "match_id": 2,
    "match_winner_user_id": null,
    "rnd1_cat1": "test category1",
    "rnd1_cat1_q1": {
      "category_id": 1,
      "correct_answer": {
        "answer_id": 1,
        "answer_text": "test answer1",
        "is_active": 1
      },
      "incorrect_answer1": {
        "answer_id": 2,
        "answer_text": "test answer2",
        "is_active": 1
      },
      "incorrect_answer2": {
        "answer_id": 3,
        "answer_text": "test answer3",
        "is_active": 1
      },
      "incorrect_answer3": {
        "answer_id": 4,
        "answer_text": "test answer4",
        "is_active": 1
      },
       (snipped part of JSON out, it's about 450 lines in total),
    "rnd2_cat2_q3_user1_answer": null,
    "rnd2_cat2_q3_user2_answer": null,
    "user1_id": 36,
    "user2_id": 21
  },
  {
    "is_active": 1,
    "match_date": "Wed, 09 Oct 2019 13:53:27 GMT",
    "match_id": 2,
    "match_winner_user_id": null,
    "rnd1_cat1": "test category1",
    "rnd1_cat1_q1": {
      "category_id": 1,
      "correct_answer": {
        "answer_id": 1,
        "answer_text": "test answer1",
        "is_active": 1
      },
      "incorrect_answer1": {
        "answer_id": 2,
        "answer_text": "test answer2",
        "is_active": 1
      },
      "incorrect_answer2": {
        "answer_id": 3,
        "answer_text": "test answer3",
        "is_active": 1
      },
      "incorrect_answer3": {
        "answer_id": 4,
        "answer_text": "test answer4",
        "is_active": 1
      },
      (snipped part of JSON out, it's about 450 lines in total),
    "rnd2_cat2_q3_user1_answer": null,
    "rnd2_cat2_q3_user2_answer": null,
    "user1_id": 36,
    "user2_id": 21
  }
]

и класс интерфейса:

    @POST("/api/v1/match/getMatches")
    Call<List<Match>> getMatches(@Header("Authorization") String authorization);

класс Match, который просто аннотирует объекты и автоматически генерируемые геттеры:

import com.google.gson.annotations.SerializedName;

public class Match {

    @SerializedName("match_id")
    private int matchId;

    @SerializedName("user1_id")
    private int user1Id;
    @SerializedName("user2_id")
    private int user2Id;

    // Categories
    @SerializedName("rnd1_cat1")
    private String rnd1_cat1;
    @SerializedName("rnd1_cat2")
    private String rnd1_cat2;
    @SerializedName("rnd2_cat1")
    private String rnd2_cat1;
    @SerializedName("rnd2_cat2")
    private String rnd2_cat2;

    //Questions, which contain answers objects within them
    @SerializedName("rnd1_cat1_q1")
    private Question rnd1_cat1_q1;
    @SerializedName("rnd1_cat1_q2")
    private Question rnd1_cat1_q2;
    @SerializedName("rnd1_cat1_q3")
    private Question rnd1_cat1_q3;
    //Cat2
    @SerializedName("rnd1_cat2_q1")
    private Question rnd1_cat2_q1;
    @SerializedName("rnd1_cat2_q2")
    private Question rnd1_cat2_q2;
    @SerializedName("rnd1_cat2_q3")
    private Question rnd1_cat2_q3;
    //Round 2
    @SerializedName("rnd2_cat1_q1")
    private Question rnd2_cat1_q1;
    @SerializedName("rnd2_cat1_q2")
    private Question rnd2_cat1_q2;
    @SerializedName("rnd2_cat1_q3")
    private Question rnd2_cat1_q3;
    //Cat2
    @SerializedName("rnd2_cat2_q1")
    private Question rnd2_cat2_q1;
    @SerializedName("rnd2_cat2_q2")
    private Question rnd2_cat2_q2;
    @SerializedName("rnd2_cat2_q3")
    private Question rnd2_cat2_q3;

    public int getMatchId() {
        return matchId;
    }

    public int getUser1Id() {
        return user1Id;
    }

    public int getUser2Id() {
        return user2Id;
    }

    public String getRnd1_cat1() {
        return rnd1_cat1;
    }

    public String getRnd1_cat2() {
        return rnd1_cat2;
    }

    public String getRnd2_cat1() {
        return rnd2_cat1;
    }

    public String getRnd2_cat2() {
        return rnd2_cat2;
    }

    public Question getRnd1_cat1_q1() {
        return rnd1_cat1_q1;
    }

    public Question getRnd1_cat1_q2() {
        return rnd1_cat1_q2;
    }

    public Question getRnd1_cat1_q3() {
        return rnd1_cat1_q3;
    }

    public Question getRnd1_cat2_q1() {
        return rnd1_cat2_q1;
    }

    public Question getRnd1_cat2_q2() {
        return rnd1_cat2_q2;
    }

    public Question getRnd1_cat2_q3() {
        return rnd1_cat2_q3;
    }

    public Question getRnd2_cat1_q1() {
        return rnd2_cat1_q1;
    }

    public Question getRnd2_cat1_q2() {
        return rnd2_cat1_q2;
    }

    public Question getRnd2_cat1_q3() {
        return rnd2_cat1_q3;
    }

    public Question getRnd2_cat2_q1() {
        return rnd2_cat2_q1;
    }

    public Question getRnd2_cat2_q2() {
        return rnd2_cat2_q2;
    }

    public Question getRnd2_cat2_q3() {
        return rnd2_cat2_q3;
    }
}

и, наконец, вызов:

Call<List<Match>> call = backendApi.getMatches(auth_token);
        call.enqueue(new Callback<List<Match>>() {
            @Override
            public void onResponse(Call<List<Match>> call, Response<List<Match>> response) {
                if(!response.isSuccessful()){
                    Log.e("login activity", "2");
                    return;
                }
                List<Match> matchList = response.body();
                Log.i("match list", matchList.size()+"");



            }

            @Override
            public void onFailure(Call<List<Match>> call, Throwable t) {
                Log.e("retrofit", t.getMessage());
            }
        });

По какой-то причине я получаю сообщение об ошибке: ожидался BEGIN_ARRAY, но был BEGIN_OBJECT на пути строки 1 столбца 2, даже если все в порядке, насколько я могуСкажите.

Любая помощь очень ценится, спасибо!

...