Bash迭代调用API生成合法JSON数组的最优实现方案
实现方案
直接用jq内置的数组收集能力即可,不需要手动拼接逗号,也不需要额外的后处理步骤,是稳定性最高、代码最简洁的实现方式。
修正后可直接使用的代码
query_api() { for p in ${param}; do # 修正了原curl的GET参数写法,自动处理参数URL编码避免请求异常 curl -s -g -G --data-urlencode "param=${p}" '/api/query' done | jq -s '.' > results.json }
核心逻辑说明
- jq的
-s(slurp)模式会自动读取管道输入的所有独立JSON对象,等所有请求完成后自动组装为标准合法的JSON数组,自动处理对象间的逗号分隔、首尾方括号,完全不会出现末尾多余逗号的问题。 - 整个流程全程按JSON结构化数据处理,不会出现纯文本拼接JSON时遇到的转义错误、格式不合法问题,生成的
results.json可以直接被jq、其他JSON解析工具读取做排序、筛选操作。
不推荐其他方案的原因
- 循环内手动添加逗号:需要额外判断当前是否为最后一次迭代,增加无意义的逻辑分支,一旦某一次API请求失败返回非JSON内容,整份文件直接格式错误,排查成本高。
- 生成零散JSON后做文本后处理:用正则、字符串替换的方式修改JSON属于非结构化处理,遇到JSON值里包含逗号、引号、嵌套对象时非常容易出现匹配错误,稳定性极差。
进阶效率优化
如果参数列表比较长,可以用xargs开启并行请求,大幅缩短总执行时间,输出结果依然是合法JSON数组:
# -P 5 表示同时开5个并行请求,可根据实际接口承载能力调整 echo ${param} | xargs -n 1 -P 5 -I {} curl -s -g -G --data-urlencode "param={}" '/api/query' | jq -s '.' > results.json
内容的提问来源于stack exchange,提问作者divedivedive
相关产品推荐
相关产品推荐

