onRetrofitFailure () Невозможно десериализовать экземпляр `java.util.ArrayList` из токена START_OBJECT - PullRequest
0 голосов
/ 31 мая 2019

Мне дают данные Json, где хранятся изображение и некоторые другие данные.Я пытаюсь получить это изображение в просмотре изображений с помощью Retrofit.Я создал DTO из необходимых вещей, как подробно описано в коде.Я получаю и ошибку, на неудачу модернизации.Как я могу решить эту проблему?

  1. Создан экземпляр модификации
  2. Создан DTO данных и свойств JSON
  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

1 Ответ

0 голосов
/ 31 мая 2019

Проблема в том, что JSON, который вы получаете от бэкэнда:

{
    "promotions": [
        ...
    ]
}

Это объект JSON, а не массив, но вы определили метод getPromotionalBanner как возвращающий List<MerchantpromotionBDTO>поэтому библиотека JSON не может выполнить десериализацию, так как ожидает массив (т.е. что-то, начинающееся с [), но находит токен START_OBJECT (т. е. {).

Вы можете решить эту проблему, изменивподпись этого метода:

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