如何在Azure Pipeline中用jq合并子文件夹文件中的数组
解决Azure Pipeline中jq合并多JSON数组的问题
问题分析
你原脚本的核心问题:
- 变量大小写错误:Linux系统区分大小写,循环变量是
objectFile,但你用了$objectfile,导致实际未正确读取子目录下的object.json文件 - 输出处理逻辑错误:循环中每次的jq输出都被管道到最后一个
jq -s .,这会把每次循环生成的完整JSON对象收集成一个数组,最终得到多个独立JSON对象的数组,而非合并后的单个对象 - 文件读写冲突:直接在循环中对
allobjects.json进行读写操作,可能因文件未完全读取就被截断写入,导致数据异常
解决方案
方案一:一次性合并(推荐,更高效简洁)
无需循环,直接用jq一次性处理基础文件和所有目标JSON文件,将所有数组元素合并到基础模板中:
jq -n ' input as $base | $base | .parameters.objects.value = [inputs.parameters.objects.value[]] ' noobjects.json OBJ*/object.json > allobjects.json
逻辑说明:
-n:让jq不自动读取所有输入,而是手动控制读取流程input as $base:读取第一个输入文件(noobjects.json)作为基础模板[inputs.parameters.objects.value[]]:读取剩余所有OBJ*/object.json文件,将每个文件中parameters.objects.value的数组元素展开,合并成一个大数组- 将基础模板中的
parameters.objects.value替换为这个合并后的大数组,最终输出到allobjects.json
方案二:修复循环脚本
如果你更倾向于用循环逐步合并,可修改脚本如下(避免读写冲突和变量错误):
cp noobjects.json allobjects.json # 用glob遍历所有OBJ开头的子目录,比ls更可靠 for dir in OBJ*/; do # 用临时文件存储中间结果,避免读写同一文件的冲突 jq -s '.[0].parameters.objects.value += .[1].parameters.objects.value | .[0]' allobjects.json "${dir}object.json" > temp.json mv temp.json allobjects.json done
逻辑说明:
- 用
OBJ*/直接匹配子目录,避免ls命令在文件名含特殊字符时出错 - 每次合并结果先写入临时文件
temp.json,再替换原文件allobjects.json,避免读写同一文件导致的数据损坏 - 修正了变量名问题,用
${dir}object.json正确拼接文件路径
验证结果
运行上述任一方案后,allobjects.json中的parameters.objects.value字段会包含所有子目录下object.json文件中的数组元素,结构与你期望的输出一致。
内容的提问来源于stack exchange,提问作者NLInnett
相关产品推荐
相关产品推荐

