我目前正在使用Retrofit和Kotlin构建应用程序。到目前为止,我可以从办公服务器解析 JSON。但是,现在我在映射数据时遇到了问题。我已经阅读了 Kotlin 地图,但不能完全理解它。对于来自服务器的 JSON,我无法上传它,因为我公司的数据存在隐私。所以,我将使用虚拟 JSON,但结构与我公司的 JSON 相同。这里是:
{"market":
"101":
{"name": "xxx",
"image": "/folderPath/imageName.jpg"
}
"102":
{"name": "yyy",
"image": "/folderPath/image2Name.jpg"
}
}
关于数据类,我使用List<>来初始化数据类,这里是:
data class Product(
@SerializedName("Market") val Market: List<MarketContent> = listOf()
)
data class MarketContent(
@SerializedName("Name") val Name: String,
@SerializedName("Image") val Image: String
)
我在 RecyclerView 适配器中尝试过的是这样的:
class OtherProductAdapter(private val otherProductList: List<MarketContent>, private val clickListener: (MarketContent) -> Unit) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.other_product, parent, false)
return ListOther(v)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
(holder as ListOther).bindItem(otherProductList[position], clickListener)
}
override fun getItemCount() = otherProductList.size
class ListOther(itemView: View) : RecyclerView.ViewHolder(itemView){
private val rImg = itemView.findViewById<ImageView>(R.id.rv_image)
fun bindItem(t: MarketContent, clickListener: (MarketContent) -> Unit){
itemView.rv_title.text = t.Name
Glide.with(itemView.context).load("http://192.168.1.100:3232" +t.Image).into(rImg)
itemView.setOnClickListener {clickListener(t)}
}
}
}
这是我的改造
private fun getInto() {
val apiService = ProductApiService()
disposable =
apiService.syncData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ result -> intoData(result) },
{ error -> Log.e("Error", error.message) }
)
}
private fun intoData(result: Product) {
rv_view?.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
rv_view?.hasFixedSize()
rv_view?.adapter = OtherProductAdapter(result.Market, { item: MarketContent -> clickedItem(item) })
}
结果,我的应用程序没有显示任何数据,并且有一条消息:
E/错误:java.lang.IllegalStateException:预期为 BEGIN_ARRAY 但在第 1 行 109719 路径 $.Market 处为 BEGIN_OBJECT
帮助我应该如何映射 JSON 数据。提前致谢。
看来你需要改变映射
@SerializedName("Market") val Market: Map<String, MarketContent> = mapOf()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句