如何通过jq与Bash脚本创建数组并追加元素,生成指定JSON结构?
用Bash和jq生成指定结构的JSON数组
我来帮你搞定这个问题!首先明确你的目标:生成一个包含data数组的JSON,每个数组元素是由两个字段值组成的子数组。你的脚本思路没问题,但在jq用法和脚本语法上有几个小问题,我们一步步修正。
目标JSON结构
{ "data": [ [ "Tiger Nixon", "Edinburgh" ], [ "Garrett Winters", "Tokyo" ] ] }
原脚本的问题
你写的脚本存在几个明显的小问题:
- 循环语法不完整:
for p in $list后面缺少do关键字,结构逻辑有断层 - 重复请求接口:同一个URL调用了两次
curl,既浪费资源又可能因接口返回波动导致数据不一致 - jq用法有误:每次迭代读写文件的方式效率低,还容易出现数据追加异常
修正后的高效脚本
我们改用一次性构建JSON的方式,避免反复读写文件,同时优化接口请求逻辑:
#!/bin/bash # 定义要遍历的URL列表,加引号避免空格/特殊字符解析错误 list=( "http://RESTURL1" "http://RESTURL2" ) # 核心逻辑:遍历URL生成子数组,再用jq组装成目标JSON jq -n '{ data: [inputs] }' < <( for p in "${list[@]}"; do # 仅请求一次接口,同时提取foo和bar字段,输出为JSON子数组 curl -s "$p" | jq '[.foo, .bar]' done ) > result.json
脚本详解
- 循环与接口请求:遍历每个URL时,只调用一次
curl获取完整数据,再用jq '[.foo, .bar]'直接生成包含两个字段值的JSON子数组,每次循环输出一行标准的子数组格式。 - 组装最终JSON:外层的
jq -n '{ data: [inputs] }'会自动收集循环输出的所有子数组,将它们统一放到data数组中,一次性生成符合要求的完整JSON文件。 - 避免临时文件:用
< <(...)进程替换的方式,把循环的输出直接传给jq,不需要创建中间文件,既高效又避免了文件读写的潜在问题。
额外注意事项
- 如果你的REST接口返回的JSON格式是
{ "foo": "xxx", "bar": "xxx" },这个脚本就能完美适配。 curl的-s参数是为了屏蔽进度条输出,让接口返回的JSON更干净。
内容的提问来源于stack exchange,提问作者MUHAHA
相关产品推荐
相关产品推荐

