Ошибка «IllegalStateException: ожидаемый BEGIN_OBJECT, но STRING» в файле JSON - PullRequest
1 голос
/ 20 марта 2020

Я делаю проект (для класса программирования в универе), но когда я пытаюсь запустить его в Android Studio, в эмуляторе очень кратко появляется предупреждение:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 5 column 21 path $[0].dateOfBirth

Это мой JSON файл:

{
  "fighters": [
    {
      "id": 1,
      "name": "Karl",
      "dateOfBirth": "20-03-1975",
      "level": 4,
      "image": "karl.png"
    },
    {
      "id": 2,
      "name": "Geralt",
      "dateOfBirth": "16-08-1964",
      "level": 8,
      "image": "Geralt.png"
    },
    {
      "id": 3,
      "name": "Darrak",
      "dateOfBirth": "25-11-1940",
      "level": 5,
      "image": "Darrak.png"
    },
    {
      "id": 4,
      "name": "Jafar",
      "dateOfBirth": "09-02-1920",
      "level": 9,
      "image": "Jafar.png"
    },
    {
      "id": 5,
      "name": "Cornelius",
      "dateOfBirth": "28-06-1988",
      "level": 2,
      "image": "Cornelius.png"
    },
    {
      "id": 6,
      "name": "Laila",
      "dateOfBirth": "18-10-1998",
      "level": 5,
      "image": "Laila.png"
    },
    {
      "id": 7,
      "name": "Marianne",
      "dateOfBirth": "01-03-1975",
      "level": 7,
      "image": "Marianne.png"
    },
    {
      "id": 8,
      "name": "Petro",
      "dateOfBirth": "10-07-1974",
      "level": 10,
      "image": "Petro.png"
    },
    {
      "id": 9,
      "name": "Ordelia",
      "dateOfBirth": "18-05-1985",
      "level": 5,
      "image": "Ordelia.png"
    },
    {
      "id": 10,
      "name": "Lucina",
      "dateOfBirth": "21-09-1992",
      "level": 9,
      "image": "Lucina.png"
    },
    {
      "id": 11,
      "name": "Hugo",
      "dateOfBirth": "16-07-1938",
      "level": 6,
      "image": "Hugo.png"
    },
    {
      "id": 12,
      "name": "Sildar",
      "dateOfBirth": "19-12-1980",
      "level": 3,
      "image": "Sildar.png"
    },
    {
      "id": 13,
      "name": "Zenok",
      "dateOfBirth": "30-10-1999",
      "level": 1,
      "image": "Zenok.png"
    },
    {
      "id": 14,
      "name": "Violet",
      "dateOfBirth": "02-04-2001",
      "level": 8,
      "image": "Violet.png"
    },
    {
      "id": 15,
      "name": "Tamara",
      "dateOfBirth": "13-06-1963",
      "level": 4,
      "image": "Tamara.png"
    }
  ],
  "encounters": [
    {
      "id": 1,
      "fighterId": 1,
      "amount_of_monsters": 4,
      "difficulty": "Medium"
    },
    {
      "id": 2,
      "fighterId": 5,
      "amount_of_monsters": 1,
      "difficulty": "Easy"
    },
    {
      "id": 3,
      "fighterId": 5,
      "amount_of_monsters": 2,
      "difficulty": "Medium"
    },
    {
      "id": 4,
      "fighterId": 7,
      "amount_of_monsters": 1,
      "difficulty": "Hard"
    },
    {
      "id": 5,
      "fighterId": 11,
      "amount_of_monsters": 7,
      "difficulty": "Medium"
    },
    {
      "id": 6,
      "fighterId": 7,
      "amount_of_monsters": 2,
      "difficulty": "Easy"
    },
    {
      "id": 7,
      "fighterId": 14,
      "amount_of_monsters": 10,
      "difficulty": "Extreme"
    },
    {
      "id": 8,
      "fighterId": 13,
      "amount_of_monsters": 4,
      "difficulty": "Medium"
    },
    {
      "id": 9,
      "fighterId": 7,
      "amount_of_monsters": 5,
      "difficulty": "Hard"
    },
    {
      "id": 10,
      "fighterId": 3,
      "amount_of_monsters": 5,
      "difficulty": "Easy"
    }
  ]
}

Строка 5 "имя": "Карл",

Что-то не так с моим атрибутом dateOfBirth, и я не знаю почему, потому что для меня синтаксис выглядит правильным. Я попытался переустановить приложение и пересобрать проект, но это не сработало.

Я впервые пишу вопрос о StackOverflow, поэтому извиняюсь, если что-то не понятно. Если кто-то может помочь, я был бы очень признателен.

РЕДАКТИРОВАТЬ (дополнительная информация)

Я использую Android Studio 3.6, API 29.

Android Версия Gradle Plugin: 3.5.3

Версия Gradle: 5.4.1

Я использую GSON для разбора JSON

JDK 11

Это функция, которую я использовал для класса GSON:

fun getFighters(): Observable<Array<Fighter>> {
        val observable = Observable.create<Array<Fighter>> { emitter ->
            try {
                var connection = connect("${BASE_URL}/fighters")
                val gson = GsonBuilder().create()
                val fighters = gson.fromJson(
                    InputStreamReader(connection.inputStream),
                    Array<Fighter>::class.java
                )
                for (fighter in fighters) {
                    connection = connect("${BASE_URL}/${fighter.image}")
                    fighter.imageBitmap = BitmapFactory.decodeStream(connection.inputStream)
                }
                emitter.onNext(fighters)
            } catch(e: Exception) {
                emitter.onError(e)
            }
        }
        return observable
    }

BASE_URL - это просто URL-адрес тестирования, так как для назначения, которое мы должны сделать, не требуется фактически развертывать приложение. Для l oop нужно показать изображения бойцов в списке RecyclerView, поэтому я использовал растровое изображение. Кроме того, вот базовый класс данных Fighter c:

data class Fighter(
    val id: Number,
    val name: String,
    val dateOfBirth: LocalDate,
    val level: Number,
    val image: String,
    var imageBitmap: Bitmap
)

1 Ответ

1 голос
/ 20 марта 2020

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

data class Fighter(
    val id: Number,
    val name: String,
    val dateOfBirth: String,
    val level: Number,
    val image: String,
    var imageBitmap: Bitmap
)

dateOfBirth хранится как String в вашем JSON, и вам нужно получить его таким образом. Если вам нужно преобразовать значение в LocalDate объект, вы всегда можете сделать это позже, после анализа информации. Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...