#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. При этом отображается пустой экран.