首页 > 解决方案 > onRetrofitFailure() 无法从 START_OBJECT 令牌中反序列化 `java.util.ArrayList` 的实例

问题描述

我得到了一个 Json 数据,其中存储了图像和其他一些数据。我正在尝试使用 Retrofit 在图像视图中获取该图像。我创建了代码中详细说明的所需内容的 DTO。我在改造失败时遇到错误。我该如何解决这个问题?

  1. 创建改造实例
  2. 创建 JSON 数据和属性的 DTO
  3. 还创建了 API 服务 https://s3.ap-south-1.amazonaws.com/zestlife/promotional_banner.json 存储 JSON 数据的链接。

    @Parcelize
    @JsonIgnoreProperties(ignoreUnknown = true)
    open class MerchantPromotionDTO(
    
        @JsonProperty("image") var image: ImageUrlsDTO? = null,
        @JsonProperty("cta") var cta: CTADTO? = null,
        @JsonProperty("probability") var probability: Int? = 0,
        @JsonProperty("isDismissible") var isDismissible: Boolean? = true,
        @JsonProperty("showImmediate") var showImmediate: Boolean? = false
        ) : BaseResponseDTO()
    
    @Parcelize
        @JsonIgnoreProperties(ignoreUnknown = true)
        class MerchantpromotionBDTO(
        @JsonProperty("promotions") var promotions: ArrayList<MerchantPromotionDTO>?=null
    ) : BaseResponseDTO()
    
    @GET("https://demo6861386.mockable.io/banner/test")
    fun getPromotionalBanner(): Call<ArrayList<MerchantpromotionBDTO>>
    
    fun getPromotionalDetails(): LiveData<ResponseDTO<ArrayList<MerchantpromotionBDTO>>>{
        val pBannerDetails=MutableLiveData<ResponseDTO<ArrayList<MerchantpromotionBDTO>>>()
        ApiComponent.enqueue({
            getPromotionalBanner(
    
            )
        },object :OnRequestComplete<ArrayList<MerchantpromotionBDTO>>{
            override fun onComplete(responseDTO: ResponseDTO<ArrayList<MerchantpromotionBDTO>>) {
                pBannerDetails.value=responseDTO
            }
        }
    )
    

编辑:

override fun onStart() {
    super.onStart()

    populateData()
}

@Synchronized
private fun populateData() {       
    MerchantpromotionBDTO?.let {
        val promImageUrl = it.image?.getImageUrl(CommonUtils.getDisplayDensityLevel(context))
        picasso.load(if (promImageUrl.isNullOrEmpty()) null else promImageUrl)
                .placeholder(R.drawable.ic_placeholder_minimal)
                .into(ivMerchantPromotionBanner)
    }
}

我希望响应到我的 logcat 并在 Imageview 中获取图像

标签: androidjsonapikotlinretrofit

解决方案


问题是您从后端获得的 JSON 是:

{
    "promotions": [
        ...
    ]
}

Thas 是 JSON 对象,而不是数组,但您将getPromotionalBanner方法定义为返回 a List<MerchantpromotionBDTO>,因此 JSON 库无法执行反序列化,因为它需要一个数组(即以 开头的东西[),但它会找到一个 START_OBJECT 令牌(即{)。

您可以通过将该方法的签名更改为:

@GET("https://demo6861386.mockable.io/banner/test")
fun getPromotionalBanner(): Call<MerchantpromotionBDTO>

推荐阅读