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