【问题标题】:How my Model Class should looks like for a retrofit request in Kotlin?对于 Kotlin 中的改造请求,我的模型类应该是什么样子?
【发布时间】:2021-03-06 06:50:38
【问题描述】:

我正在尝试在 Kotlin 中使用 Retrofit2 创建一个请求,我的 Json 数据如下所示:

{
  "actionRights": [
    {
      "hasArticlePriceChangeRights": false,
      "hasStockLevelViewRights": false
    }
  ],
  "stats": {
    "errors": 12,
    "warnings": 21,
    "outOfOrder": 58,
    "running": 42
  },
  "markers": []
}

我需要从我的回复中获取“统计”数据。

我的模型类是什么样的?我尝试了一些方法,但出现此错误。

预期为 BEGIN_OBJECT,但在第 1 行第 2 列路径 $ 处为 BEGIN_ARRAY

编辑:我创建了这个 ModelClass,但我仍然收到此错误: 应为 BEGIN_OBJECT,但在第 1 行第 2 列路径 $

处为 BEGIN_ARRAY
data class StatsModel(
        @SerializedName("actionRights") val actionRights : List<ActionRights>,
        @SerializedName("stats") val stats : Stats,
        @SerializedName("markers") val markers : List<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
    )
}

我正在处理这样的响应:

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) {
                    Log.i("TEST", "ITEM " + response.headers().toString())
                        statusData = response.body()!!.stats
                        Log.i("TEST", "ITEM $statusData")
                        statusCallbacks.onSuccess(statusData)

                }
            }
        })
    }

【问题讨论】:

标签: android kotlin request retrofit retrofit2


【解决方案1】:
 data class ActionRight(
val hasArticlePriceChangeRights: Boolean?=null,
val hasStockLevelViewRights: Boolean?=null
 )

这是为了状态

   data class Stats(
    val errors:Int? = null,
    val warnings? = null,
    val outOfOrder? = null,
    val running? = null
    )

将此模型调用到您的改造中,您只会得到您的状态

data class StatsModel(
val actionRights: ArrrayList<ActionRight>?=null,
val markers: ArrrayList<Any>?=null,
val stats: Stats? = null)

【讨论】:

【解决方案2】:

您的主要模特:

data class MyModel(
    val actionRights: List<ActionRight?>?,
    val markers: List<Marker?>?,
    val stats: Stats?
)

您的子模型:

data class ActionRight(
    val hasArticlePriceChangeRights: Boolean?,
    val hasStockLevelViewRights: Boolean?
)
data class Marker(
    val test1: Int?,
    val test2: String?
)
data class Stats(
    val errors: Int?,
    val outOfOrder: Int?,
    val running: Int?,
    val warnings: Int?
)

我创建了一个假的 Marker 类,因为我不知道你的完整 json 数据。

您应该根据您的 json 数据对 Marker 类进行建模。您可以从改造中调用MyModel 类。

编辑响应(仅解析 Stats 类)

这个类代表只解析统计类,你可以从改造中调用。 @JsonIgnoreProperties 应该忽略其他数据。

@JsonIgnoreProperties(ignoreUnknown = true)
data class MyModel(
    @JsonProperty("stats")
    val stats: Stats?
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class Stats(
    @JsonProperty("errors")
    val errors: Int?,
    @JsonProperty("outOfOrder")
    val outOfOrder: Int?,
    @JsonProperty("running")
    val running: Int?,
    @JsonProperty("warnings")
    val warnings: Int?
)

注意:代码使用Jackson库。

implementation 'com.squareup.retrofit2:converter-jackson:2.5.0'

【讨论】:

  • 但是我可以只使用 stats : Stats 字段创建 MyModel 类吗?还是必须包含 json 数据中的所有字段?
  • 我更新了我的问题,你能复习一下吗?谢谢!
  • 您的项目使用哪个 json 解析器?据我了解,您只需要统计数据。这是可能的,但我不确定这是正确的方法。您需要忽略 json 中的属性。例如,如果您使用Jackson 库,您可以尝试@JsonIgnoreProperties(ignoreUnknown = true) 注释。如果你需要这个,我可以更新我的回复。
  • 但如果我的 ModelClass 与 Json 响应完全一样,我不知道为什么会出现该错误..
  • 我找到了问题,并解决了!感谢您的时间和帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 2015-12-09
  • 2017-12-14
  • 1970-01-01
相关资源
最近更新 更多