Intereting Posts
Передающая функция как параметр в котлине Как реализовать функцию Kotlin для представления Форма входа с повторным запросом на rxJava и дооснащение Невозможно запустить сканирование покрытия (Java / Kotlin / Gradle 3.3 на Windows и Travis) Как преобразовать список стираемых типов в массив в Котлин? Как предотвратить закрытие диалогового окна (предупреждения) при касании снаружи или отменить использование Anko Можете ли вы иметь общий основной конструктор в Котлин? Приложение Spring Boot: наблюдатель файловой системы для многих путей Уведомление о прямом ответе начинает действие Кодирование запроса почтальона Попытка загрузить файл в основное действие onCreate Переменная «runnable» должна быть инициализирована Как создать бесконечно длинную последовательность в Котлине Замок Kotlin подстановочного знака в параметре обратного вызова списка Kotlin и TornadoFX: привязать наблюдаемое свойство к функции коллекции?

GSON бросает Ожидаемый BEGIN_OBJECT, но BEGIN_ARRAY

Столкнувшись с этой проблемой последние несколько дней. Кто-нибудь из ребят проверяет эту проблему? Любая помощь будет принята с благодарностью. Как я могу решить эту проблему?

GSON бросает Ожидаемый BEGIN_OBJECT, но BEGIN_ARRAY

Проблема, исходящая из

override fun onSuccess(str_SUCCESS: String) { System.out.println("JSON_IS"+str_SUCCESS) val paymentScheduleModel = Gson().fromJson<PaymentScheduleModel>(str_SUCCESS, PaymentScheduleModel::class.java) // Problem here } 

Json Response –

 { "status": { "statusCode": 10016, "isSuccess": true, "message": "Success" }, "data": { "payback_schedule": [ { "id": 2, "paid_amount": "INR NaN", "paidStatus": "Upcoming Payback", "paid_status": "P", "s_date": "05/01/2018 12:31:10", "e_date": "11/01/2018 12:31:10", "current_balance": "INR 399", "payanytime_button_status": "active", "btnColor": "red", "btnHexColor": "#D2322D" }, { "id": 3, "paid_amount": "INR NaN", "paidStatus": "Upcoming Payback", "paid_status": "P", "s_date": "12/01/2018 12:31:10", "e_date": "18/01/2018 12:31:10", "current_balance": "INR 399", "payanytime_button_status": "active", "btnColor": "red", "btnHexColor": "#D2322D" } ] } } 

PaymentScheduleModel

 data class PaymentScheduleModel(@SerializedName("payback_schedule") val payback_schedule: PaymentSchedule) data class PaymentSchedule (@SerializedName("id") val id: Int, @SerializedName("paid_amount") val paid_amount:String, @SerializedName("paidStatus") val paidStatus:String, @SerializedName("paid_status") val paid_status:String, @SerializedName("s_date") val s_date:String, @SerializedName("e_date") val e_date:String, @SerializedName("current_balance") val current_balance:String, @SerializedName("payanytime_button_status") val payanytime_button_status:String, @SerializedName("btnColor") val btnColor:String, @SerializedName("btnHexColor") val btnHexColor:String) 

Ваш объект модели не соответствует вашему Json.

Вы пытаетесь разобрать JsonObject PaymentScheduleModel которого есть подчиненный объект «payback_schedule» типа PaymentSchedule но у вас есть JsonObject, у которого есть «данные» под-объекта, что и есть под-объект «payback_schedule». Итак, вы хотите проанализировать блок данных.

У вас есть два варианта:

1: Создайте еще одну модель, которая обертывает блок данных и анализирует это:

 data class PaymentScheduleData(@SerializedName("data") val payback_schedule_model: PaymentScheduleModel) override fun onSuccess(str_SUCCESS: String) { val paymentScheduleData = Gson().fromJson<PaymentScheduleData>(str_SUCCESS, PaymentScheduleData::class.java) // Now use paymentScheduleData.payback_schedule_model } 

2: Сначала вытащите часть данных, затем выполните синтаксический анализ:

 override fun onSuccess(str_SUCCESS: String) { // Get the root JsonObject val jsonObject = Gson().fromJson<JsonObject>(str_SUCCESS, JsonObject::class.java) // Get the "data" block that matches the model and parse that val paymentScheduleModel = Gson().fromJson<PaymentScheduleModel>(jsonObject.getAsJsonObject("data"), PaymentScheduleModel::class.java) } 

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

Ошибка говорит вам, что payback_schedule содержит массив вместо объекта. Таким образом, payback_schedule должен быть Array<PaymentSchedule> вместо PaymentSchedule .

 data class PaymentScheduleModel(@SerializedName("payback_schedule") val payback_schedule: Array<PaymentSchedule>) 

PS. Вам предлагается реализовать собственные функции equals() и hashCode() если ваш класс данных содержит Array потому что реализация по умолчанию функции equals() Array сравнивает ссылочное равенство . Предлагаемое чтение: метод Equals для класса данных в kotlin