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

karate.repeat生成畸形JSON无法遍历,求替代循环方案

问题分析

你遇到的核心问题是:karate.repeat多次调用次级feature后,返回的多个独立JSON对象直接拼接输出,导致整体结构不合法;同时次级feature返回的结果带有动态后缀的键名(如Total_packages1、package2),无法通过统一路径遍历提取tags。


解决方案

方案1:修正karate.repeat的返回结果结构

修改调用函数,每次调用后提取固定格式的结果,让最终返回值成为可遍历的数组:

* def fun = function(i){ 
    // 调用次级feature
    var callResult = karate.call('abc.feature@abc', value);
    // 根据迭代次数拼接动态键名
    var totalKey = 'Total_packages' + (i + 1);
    var packageKey = 'package' + (i + 1);
    // 提取需要的package对象返回
    return callResult[totalKey][packageKey];
}
* def loopResults = karate.repeat(2, fun)
// 遍历数组获取所有tags
* def allTags = loopResults.map(item => item.tags)
* karate.log(allTags)

方案2:用原生JS循环手动收集结果

如果karate.repeat的行为不符合预期,改用普通for循环手动构建结果数组,逻辑更直观可控:

* def packageResults = []
* for (var idx = 0; idx < 2; idx++) {
    var res = karate.call('abc.feature@abc', value);
    // 提取当前迭代的package数据
    var totalKey = 'Total_packages' + (idx + 1);
    var packageKey = 'package' + (idx + 1);
    packageResults.push(res[totalKey][packageKey]);
}
// 遍历数组获取所有tags
* def allTags = packageResults.map(pkg => pkg.tags)
* karate.log(allTags)

优化建议:修改次级feature统一返回结构

如果有权限修改abc.feature@abc,可以在场景末尾统一返回格式,彻底避免动态键名的麻烦:
在abc.feature@abc的最后添加:

// 自动提取Total_packagesN下的packageN内容
* def packageData = response[Object.keys(response)[0]][Object.keys(response[Object.keys(response)[0]])[0]]
* return packageData

此时循环代码可简化为:

* def fun = function(i){ return karate.call('abc.feature@abc', value) }
* def loopResults = karate.repeat(2, fun)
* def allTags = loopResults.map(item => item.tags)

内容的提问来源于stack exchange,提问作者hungryhippos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:30:50