如何在Groovy中创建动态长度的JSON数组(SoapUI场景)
问题根因
- 循环内反复给
Details字段赋值会直接覆盖旧值,最终仅保留最后一次循环的写入结果 [i].collect{...}仅会生成单元素数组,无法累加多轮循环的对象
修复后实现代码
import groovy.json.JsonBuilder def IDValue = ... // 存储所有ID的数组 def Description = ... // 存储所有描述的数组 // 提前校验两个数组长度一致,避免下标越界 assert IDValue.size() == Description.size(): "ID数组和描述数组长度不一致" def detailsList = [] // 遍历所有下标,攒齐所有详情对象 for (int i = 0; i < IDValue.size(); i++) { detailsList << [ id: IDValue[i], Desc: Description[i] ] } // 一次性生成JSON JsonBuilder builder = new JsonBuilder() builder { Details(detailsList) } log.info builder.toPrettyString()
实现说明
- 先初始化空列表
detailsList用来承接所有的详情条目 - 循环过程中只做列表元素追加,不操作JSON构造器,避免字段覆盖
- 所有条目收集完成后,一次性把完整列表赋值给
Details字段,即可生成包含全部12个对象的JSON数组 - 新增的长度校验可以提前发现两个数组长度不匹配的问题,避免运行时出现下标越界异常
如果你偏好Groovy的函数式写法,也可以用更简洁的无循环实现:
import groovy.json.JsonBuilder def IDValue = ... def Description = ... assert IDValue.size() == Description.size() def builder = new JsonBuilder() builder { Details([IDValue, Description].transpose().collect { id, desc -> [id: id, Desc: desc] }) } log.info builder.toPrettyString()
该写法用transpose把两个数组合并为[id,描述]配对的二维数组,再直接转换为目标对象列表,不需要手动维护下标,代码更简洁不易出错。
内容的提问来源于stack exchange,提问作者Tanveer Singh
相关产品推荐
相关产品推荐

