Анализ ответа JSON при возврате в виде массива - PullRequest
0 голосов
/ 02 ноября 2019
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

Это ошибка, которую я продолжаю получать при попытке проанализировать мои входящие данные ответа JSON. Я использую библиотеку OkHttp для создания и вызова, и API, от которого я получаю результаты, возвращает все в массиве следующим образом:

    [
      {
        "id": 4256,
        "image_url": "https://cdn.pandascore.co/images/league/image/4256/OMEN_Challenger_Series_2019.png",
        "live_supported": false,
        "modified_at": "2019-10-30T10:02:42Z",
        "name": "OMEN Challenger",
        "series": [
          {
            "begin_at": "2019-11-01T03:30:00Z",
            "description": null,
            "end_at": null,
            "full_name": "2019",
            "id": 1932,
            "league_id": 4256,
            "modified_at": "2019-10-30T09:11:40Z",
            "name": null,
            "prizepool": "50000 United States Dollar",
            "season": null,
            "slug": "cs-go-omen-challenger-2019",
            "winner_id": null,
            "winner_type": null,
            "year": 2019
          }
        ],
        "slug": "cs-go-omen-challenger",
        "url": "https://omengaming.co/omen_cs/",
        "videogame": {
          "current_version": null,
          "id": 3,
          "name": "CS:GO",
          "slug": "cs-go"
        }
      },
      {...},
      {...},
      {...},
      {...},
    ]

Я обнаружил, что многие люди рекомендуют Gson проанализировать его впользовательский класс, но следующий код, по идее, должен работать, а это не так. Разбор даже не начинается, потому что он ожидает BEGIN_OBJECT и BEGIN_ARRAY:

String jsonData = response.body().string();
Gson gson = new Gson();
EventInfo test = gson.fromJson(jsonData, EventInfo.class);

class EventInfo {

    String imageURL;
    String name;
    JSONArray series;

}

Ответы [ 3 ]

1 голос
/ 02 ноября 2019

Вы пытаетесь разобрать его в объект. Но по вашему ответу вы можете ясно увидеть, что это список. Родительский POJO должен был быть списком. И внутри этого списка вы должны были создать еще одно POJO.

1 голос
/ 02 ноября 2019

В вашем ответе родитель находится как массив , но вам нужно добавить первый родитель как JSON объект и потомок как массив или объект.

Вам нужен такой ответ

{
    "YourArrayName":[
        "YourChildObjName":{
            "id": 4256,
            "image_url": "https://cdn.pandascore.co/images/league/image/4256/OMEN_Challenger_Series_2019.png",
            "live_supported": false,
            "modified_at": "2019-10-30T10:02:42Z",
            "name": "OMEN Challenger",
            "series": [
                {
                    "begin_at": "2019-11-01T03:30:00Z",
                    "description": null,
                    "end_at": null,
                    "full_name": "2019",
                    "id": 1932,
                    "league_id": 4256,
                    "modified_at": "2019-10-30T09:11:40Z",
                    "name": null,
                    "prizepool": "50000 United States Dollar",
                    "season": null,
                    "slug": "cs-go-omen-challenger-2019",
                    "winner_id": null,
                    "winner_type": null,
                    "year": 2019
                }
            ],
            "slug": "cs-go-omen-challenger",
            "url": "https://omengaming.co/omen_cs/",
            "videogame": {
                "current_version": null,
                "id": 3,
                "name": "CS:GO",
                "slug": "cs-go"
            }
        },
        {...},
        {...},
        {...},
        {...},
    ]
}

Надеюсь, это поможет Вам!

Спасибо

0 голосов
/ 02 ноября 2019

Итак, я понял это. Первоначально я получал ту же ошибку на более позднем этапе;а именно, когда он достиг значения ключа series в первом JSONObject. Первоначальная ошибка произошла из-за того, что я пытался проанализировать series как JSONArray, а не List<JSONObject>. Ниже приведены исправления:

String jsonData = response.body().string();
Gson gson = new Gson();
Type listType = new TypeToken<List<EventInfo>>() {}.getType();
List<EventInfo> test = gson.fromJson(jsonData, listType);

И класс EventInfo:

class EventInfo {

    String imageURL;
    String name;
    List<JSONObject> series;

}

Спасибо за совет всем!

...