ОШИБКА: com.google.gson.Исключение JsonSyntaxException: java.lang.IllegalStateException: Ожидаемый BEGIN_OBJECT, но был BEGIN_ARRAY в строке 1, столбец 2, путь $

#android #json #kotlin #request #retrofit2

#Android #json #котлин #запрос #retrofit2

Вопрос:

Я пытаюсь создать POST-запрос с помощью Retrofit2, и я создал следующие классы:

Мои данные JSON: https: //jsonblob.com/d7b06b4c-2e4b-11eb-967c-5704a225d894

Класс модели

 data class StatsModel(
    @SerializedName("actionRights")
    val actionRights : MutableList<ActionRights>?,
    @SerializedName("stats")
    val stats : Stats?,
    @SerializedName("markers")
    val markers : MutableList<Markers>?
) {
data class ActionRights (
        @SerializedName("hasArticlePriceChangeRights") val hasArticlePriceChangeRights : Boolean?,
        @SerializedName("hasStockLevelViewRights") val hasStockLevelViewRights : Boolean?
)


data class Stats (
        @SerializedName("errors") val errors : Int?,
        @SerializedName("warnings") val warnings : Int?,
        @SerializedName("outOfOrder") val outOfOrder : Int?,
        @SerializedName("running") val running : Int?
)

data class Markers (
        @SerializedName("deviceGuid") val deviceGuid : String?,
        @SerializedName("lat") val lat : Double?,
        @SerializedName("lng") val lng : Double?,
        @SerializedName("title") val title : Int?,
        @SerializedName("city") val city : String?,
        @SerializedName("street") val street : Int?,
        @SerializedName("serialNumber") val serialNumber : Int?,
        @SerializedName("LastStatusMessageDateTime") val lastStatusMessageDateTime : String?,
        @SerializedName("LastStatusMessageBitSet_0_63") val lastStatusMessageBitSet_0_63 : Int?,
        @SerializedName("LastStatusMessageBitSet_64_127") val lastStatusMessageBitSet_64_127 : Int?,
        @SerializedName("ActionsStatus") val actionsStatus : Int?,
        @SerializedName("SpareColumn1") val spareColumn1 : String?,
        @SerializedName("SpareColumn2") val spareColumn2 : String?,
        @SerializedName("SpareColumn3") val spareColumn3 : String?,
        @SerializedName("SpareColumn4") val spareColumn4 : String?,
        @SerializedName("SpareColumn5") val spareColumn5 : String?,
        @SerializedName("SpareColumn6") val spareColumn6 : String?,
        @SerializedName("SpareColumn7") val spareColumn7 : String?,
        @SerializedName("SpareColumn8") val spareColumn8 : String?,
        @SerializedName("SpareColumn9") val spareColumn9 : String?,
        @SerializedName("SpareColumn10") val spareColumn10 : String?,
        @SerializedName("EstimatedDeliveryDateTime") val estimatedDeliveryDateTime : String?,
        @SerializedName("IpAddress") val ipAddress : String?,
        @SerializedName("Active") val active : Int?,
        @SerializedName("ParentAreaGuid") val parentAreaGuid : String?,
        @SerializedName("AreaGuid") val areaGuid : String?,
        @SerializedName("TariffGroupGuid") val tariffGroupGuid : String?,
        @SerializedName("DeviceType") val deviceType : String?,
        @SerializedName("EstimateArticleName") val estimateArticleName : String?,
        @SerializedName("EstimateArticleGuid") val estimateArticleGuid : String?,
        @SerializedName("lastCoinboxExchange") val lastCoinboxExchange : String?,
        @SerializedName("lastStatusUpdateTime") val lastStatusUpdateTime : String?,
        @SerializedName("reportDateTime") val reportDateTime : String?,
        @SerializedName("hasFinancialInfo") val hasFinancialInfo : Boolean?,
        @SerializedName("ticketsSold") val ticketsSold : Int?,
        @SerializedName("cash") val cash : Int?,
        @SerializedName("cashless") val cashless : Int?,
        @SerializedName("hasStockLevel") val hasStockLevel : Boolean?,
        @SerializedName("hasArticlePrices") val hasArticlePrices : Boolean?,
        @SerializedName("EstDeliveryDays") val estDeliveryDays : String?,
        @SerializedName("hasOther") val hasOther : Boolean?,
        @SerializedName("hasOutOfOrder") val hasOutOfOrder : Boolean?,
        @SerializedName("hasWarning") val hasWarning : Boolean?,
        @SerializedName("hasError") val hasError : Boolean?,
        @SerializedName("flags") val flags : List<Flags>?,
        @SerializedName("actionState") val actionState : String?,
        @SerializedName("spareColumns") val spareColumns : List<SpareColumns>?
)

data class Flags (
        @SerializedName("ErrorLevel") val errorLevel : Int?,
        @SerializedName("ErrorFlag") val errorFlag : Int?,
        @SerializedName("Translation") val translation : String?,
        @SerializedName("BitPosition") val bitPosition : Int?
)

data class SpareColumns (
        @SerializedName("key") val key : String?,
        @SerializedName("value") val value : String?
)
 

Интерфейс RequestService:

 @GET(NetworkUtils.JSON_SERVICE_URL)
fun getStatus(@Header("guid") guid: String) : Call<StatsModel>
 

Метод, который обрабатывает ответ:

 fun getStatusService(mandatorGuid: String, @Nullable statusCallbacks: ChartsCallbacks.StatsCallbacks) {
    val mandatorItem = MandatorItem(mandatorGuid)
    val guid: MutableMap<String, String> = HashMap()
    guid["guid"] = mandatorItem.guid
    var statusData: StatsModel.Stats?

    val call: Call<StatsModel> = createAPI().getStatus(mandatorItem.guid)
    call.enqueue(object : Callback<StatsModel> {
        override fun onFailure(call: Call<StatsModel>, t: Throwable) {
            Log.i("TEST", "Status failure: $t")
        }

        override fun onResponse(call: Call<StatsModel>, response: Response<StatsModel>) {
            if (response.isSuccessful) {
                statusData = response.body()!!.stats
                Log.i("TEST", "ITEM $statusData")
                statusCallbacks.onSuccess(statusData)

            }
        }
    })
}
 

Мне нужны только статистические данные из ответа!
Но каждый раз, когда я пытаюсь выполнить запрос, я получаю эту ОШИБКУ:
com.google.gson.Исключение JsonSyntaxException: java.lang.IllegalStateException: Ожидаемый BEGIN_OBJECT, но был BEGIN_ARRAY в строке 1, столбец 2, путь $

Я знаю, что есть много сообщений на эту тему, но я не смог найти решение своей проблемы. Любая помощь будет оценена!

Комментарии:

1. в вашей StatsModel есть несоответствие, в api его возвращаемый массив, но ваша StatsModel является объектом

2. Каков ответ API? Можете ли вы поделиться json?

3. Ответ API слишком большой, и я не могу поделиться json.. Но я использовал инструмент для преобразования JSON в классы моделей Kotlin, поэтому я не думаю, что это несоответствие в моей StatsModel..

4. Это то, что я использовал: json2kotlin.com

5. При этом отображается пустой экран.