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(str_SUCCESS, PaymentScheduleModel::class.java) // Problem here } 

Json回应是

 { "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。

您试图解析具有PaymentScheduleModeltypes的子对象“payback_schedule”的JsonObject PaymentScheduleModel ,但您有一个具有子对象“data”的JsonObject,该子对象具有子对象“payback_schedule”。 所以真的,你想解析“数据”块。

你有两个选择:

1:创建另一个包装数据块的模型并解析:

 data class PaymentScheduleData(@SerializedName("data") val payback_schedule_model: PaymentScheduleModel) override fun onSuccess(str_SUCCESS: String) { val paymentScheduleData = Gson().fromJson(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(str_SUCCESS, JsonObject::class.java) // Get the "data" block that matches the model and parse that val paymentScheduleModel = Gson().fromJson(jsonObject.getAsJsonObject("data"), PaymentScheduleModel::class.java) } 

希望有所帮助!

错误是告诉你, payback_schedule是持有一个数组而不是对象。 所以, payback_schedule应该是Array而不是PaymentSchedule

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

PS。 如果您的数据类包含Array则建议您实现自己的equals()hashCode()函数,因为Arrayequals()函数的默认实现会比较参照相等性 。 建议阅读: kotlin中数据类的等式方法