Groovy向List添加JSON对象异常:输出均为最后元素求助
问题:Groovy操作JSON数组时输出全部为最后元素的重复?
输入的JSON数组accounts:
[{"F57UI02A_AID": "00206847"},{"F57UI02A_AID": "00206855"},{"F57UI02A_AID": "00206852"}]
需求:给每个内部JSON对象添加序列编号,预期输出:
[{"F57UI02A_AID": "00206847", "Sequence": "1"},{"F57UI02A_AID": "00206855", "Sequence": "2"},{"F57UI02A_AID": "00206852", "Sequence": "3"}]
实现代码:
def accountList = accounts.collect{ it.get("F57UI02A_AID") }; int size = accounts.size(); def currentElement = new JsonBuilder(); String sequence = ""; def outputArray = []; for (int i = 0; i < size; i++){ sequence = i+1; currentElement F57UI02A_AID: accountList[i], Sequence: sequence; outputArray[i] = currentElement; //outputArray << currentElement; } returnMap.put("output", outputArray); return returnMap;
实际测试输出:
[{"F57UI02A_AID":"00206852","Sequence":"3"}, {"F57UI02A_AID":"00206852","Sequence":"3"}, {"F57UI02A_AID":"00206852","Sequence":"3"}]
问题:为何会出现这种输出均为最后元素的情况?
原因分析
- 你只创建了一个
JsonBuilder实例currentElement,循环中每次调用currentElement F57UI02A_AID: ...本质是修改这个实例内部的内容,而非创建新对象。 - 数组
outputArray里的所有元素都是指向同一个currentElement实例的引用。循环结束后,该实例的内容被最后一次循环的赋值覆盖,因此数组中所有元素显示的都是最后一次的结果。
修正方案
把JsonBuilder的创建放到循环内部,每次循环生成新实例,确保每个元素都是独立对象:
def outputArray = [] accounts.eachWithIndex { account, index -> def currentElement = new JsonBuilder() currentElement F57UI02A_AID: account.F57UI02A_AID, Sequence: (index + 1).toString() outputArray << currentElement.content } returnMap.put("output", outputArray) return returnMap
或者用更简洁的collect写法,直接生成独立Map:
def outputArray = accounts.collectWithIndex { account, index -> [F57UI02A_AID: account.F57UI02A_AID, Sequence: (index + 1).toString()] } returnMap.put("output", outputArray) return returnMap
说明
eachWithIndex/collectWithIndex可直接遍历原数组并获取索引,无需提前收集F57UI02A_AID,简化代码逻辑。- 每次循环创建新对象(
JsonBuilder或Map),避免了引用复用导致的内容覆盖问题。
内容的提问来源于stack exchange,提问作者Marce
相关产品推荐
相关产品推荐

