在Kotlin中为Retrofit构建包含多元素数组的JSON对象时重复数据问题的解决方法
解决Kotlin中Retrofit JSON数组添加重复元素的问题
我明白你碰到的问题了——循环结束后arrayProducts里全是一模一样的元素,这可不是Retrofit的锅,问题出在你创建JsonObject的位置上!
你现在的代码里,objSubBuyNow是在循环外面创建的,每次循环只是修改这个对象的属性值,然后把同一个对象的引用添加到数组里。这就好比你只有一个盒子,每次把盒子里的东西换掉,然后把同一个盒子放进数组好几次,最后数组里的所有“盒子”其实都是同一个,自然显示的都是最后一次放进去的内容。
修正后的代码
把JsonObject的创建移到循环内部,每次循环都生成一个全新的对象:
val objBuyNow = JsonObject() val arrayProducts = JsonArray() for (i in 0 until response.arrList?.size!!) { // 关键:每次循环都新建一个JsonObject实例 val objSubBuyNow = JsonObject() objSubBuyNow.addProperty("strProductId", response.arrList[i]?._id) Log.i("kaaa", response.arrList[i]?._id.toString()) objSubBuyNow.addProperty("dblQty", response.arrList[i]?.dblQty) objSubBuyNow.addProperty("strSize", response.arrList[i]?.strSize) objSubBuyNow.addProperty("strColor", response.arrList[i]?.strColor) objSubBuyNow.addProperty("strName", response.arrList[i]?.strName) objSubBuyNow.addProperty("dblAmount", response.arrList[i]?.dblMRP) objSubBuyNow.addProperty("strImageUrl", response.arrList[i]?.strImageUrl) arrayProducts.add(objSubBuyNow) } objBuyNow.add("arrProducts", arrayProducts)
更简洁的写法(推荐)
用Kotlin的forEach和apply函数让代码更简洁易读:
val objBuyNow = JsonObject() val arrayProducts = JsonArray().apply { response.arrList?.forEach { product -> val objSubBuyNow = JsonObject().apply { addProperty("strProductId", product?._id) addProperty("dblQty", product?.dblQty) addProperty("strSize", product?.strSize) addProperty("strColor", product?.strColor) addProperty("strName", product?.strName) addProperty("dblAmount", product?.dblMRP) addProperty("strImageUrl", product?.strImageUrl) } add(objSubBuyNow) product?._id?.let { Log.i("kaaa", it.toString()) } } } objBuyNow.add("arrProducts", arrayProducts)
这样修改后,每个商品都会对应一个独立的JsonObject,添加到数组里的都是不同的对象引用,自然就不会出现重复元素的问题啦。
内容的提问来源于stack exchange,提问作者Jishnu
相关产品推荐
相关产品推荐

