android - onRetrofitFailure() 无法从 START_OBJECT 令牌中反序列化 `java.util.ArrayList` 的实例
问题描述
我得到了一个 Json 数据,其中存储了图像和其他一些数据。我正在尝试使用 Retrofit 在图像视图中获取该图像。我创建了代码中详细说明的所需内容的 DTO。我在改造失败时遇到错误。我该如何解决这个问题?
- 创建改造实例
- 创建 JSON 数据和属性的 DTO
还创建了 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 中获取图像
解决方案
问题是您从后端获得的 JSON 是:
{
"promotions": [
...
]
}
Thas 是 JSON 对象,而不是数组,但您将getPromotionalBanner
方法定义为返回 a List<MerchantpromotionBDTO>
,因此 JSON 库无法执行反序列化,因为它需要一个数组(即以 开头的东西[
),但它会找到一个 START_OBJECT 令牌(即{
)。
您可以通过将该方法的签名更改为:
@GET("https://demo6861386.mockable.io/banner/test")
fun getPromotionalBanner(): Call<MerchantpromotionBDTO>
推荐阅读
- c++ - C++ 20:std::array 作为非类型模板参数重新洗牌元素
- azure-devops - 将 SonarQube 添加到 Azure DevOps 存储库时管道失败
- python - 创建一个函数来计算不同年份的中位数成本
- python - 具有不规则数据的 Matplotlib 轮廓
- flutter - Flutter - 无需用户交互即可重建 GestureDetector 小部件
- nginx - Nginx 没有将 https:// 非 www 重定向到 www
- nix - 我的 .config/nixpkgs/config.nix 文件未加载
- python - 在 discord.py 中无法获得语音频道
- java - 如何在没有 setter 方法的情况下设置值?
- batch-file - 重命名字符“=”和“!”