You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:52:47