Kotlin如何通过循环遍历JSON数组拼接打印item_size的键值对
问题根因
你当前的实现存在两个核心问题:
- 代码冗余:重复初始化了两次JSONObject、JSONArray的获取逻辑
- 赋值覆盖:每次循环都直接给
itemsizename.text赋新值,新值会完全覆盖上一次循环的结果,因此最终只能展示数组最后一项的内容 - 缺少结果累积:没有在循环外定义可复用的存储容器,无法跨循环累积所有元素的拼接内容
修复实现
方案1:基于现有原生JSONObject逻辑修改
核心思路是在循环外提前定义可变字符串容器,循环内逐次追加每一项的内容,全部遍历完成后再把最终拼接的结果赋值给控件。
修改后代码:
val obj = JSONObject(json) val resultObject = obj.getJSONObject("result") val itemSizeArray = resultObject.getJSONArray("item_size") // 用StringBuilder存储拼接结果,字符串拼接性能更优 val sizeBuilder = StringBuilder() for (i in 0 until itemSizeArray.length()) { val sizeItem = itemSizeArray.getJSONObject(i) val name = sizeItem.getString("name") val value = sizeItem.getString("value") // 非第一个元素前增加要求的分隔符 "/ " if (i != 0) { sizeBuilder.append("/ ") } sizeBuilder.append("$name:$value") } // 遍历完成后统一给控件赋值 itemsizename.text = sizeBuilder.toString()
该逻辑会自动适配item_size数组的长度,后续数组新增任意数量的元素都不需要修改代码,最终输出格式与要求的Height:29cm/ Width:52cm完全一致。
方案2:基于已定义的模型类实现(更简洁可维护)
你已经根据JSON结构定义好了对应的数据类,完全可以借助Gson、Moshi这类序列化工具直接将JSON转为实体对象,不需要手动逐字段解析,后续维护成本更低。
以Gson实现为例:
// 直接将JSON反序列化为提前定义好的Json3实体对象 val response = Gson().fromJson(json, Json3::class.java) // 用Kotlin集合扩展方法自动完成全量元素拼接 val sizeText = response.result.item_size.joinToString("/ ") { size -> "${size.name}:${size.value}" } itemsizename.text = sizeText
joinToString方法会自动按照指定分隔符拼接列表所有元素,不需要手动判断循环下标、处理首尾多余的分隔符- 完全适配item_size的元素数量,后续新增任意尺寸字段,代码无需任何修改即可自动展示
内容的提问来源于stack exchange,提问作者sara
相关产品推荐
相关产品推荐

