【问题标题】:onRetrofitFailure() Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT tokenonRetrofitFailure() 无法从 START_OBJECT 令牌中反序列化 `java.util.ArrayList` 的实例
【发布时间】:2019-10-16 23:16:30
【问题描述】:

我得到一个 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 中获取图像

【问题讨论】:

    标签: android json api kotlin retrofit


    【解决方案1】:

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

    {
        "promotions": [
            ...
        ]
    }
    

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

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

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

    【讨论】:

    • 您好先生,感谢您对此问题的回复。在我对您的响应采取行动后,RetrofitFailure 上的错误已消除,但我仍然无法从给定的 API 获取图像。
    • 我错过了添加毕加索库代码。我已经编辑了 que。请看
    • 如果什么都没发生 - logcat 中没有错误/异常并且没有加载图像 - 这可能是由于促销横幅为 null 引起的,因为不会调用 let 函数它。调查此问题的最佳方法是调试您的代码
    • 我会注意的。非常感谢先生。
    猜你喜欢
    • 2014-01-17
    • 2021-03-26
    • 2017-09-22
    • 2020-02-20
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多