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

如何通过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

脚本详解

  1. 循环与接口请求:遍历每个URL时,只调用一次curl获取完整数据,再用jq '[.foo, .bar]'直接生成包含两个字段值的JSON子数组,每次循环输出一行标准的子数组格式。
  2. 组装最终JSON:外层的jq -n '{ data: [inputs] }'会自动收集循环输出的所有子数组,将它们统一放到data数组中,一次性生成符合要求的完整JSON文件。
  3. 避免临时文件:用< <(...)进程替换的方式,把循环的输出直接传给jq,不需要创建中间文件,既高效又避免了文件读写的潜在问题。

额外注意事项

  • 如果你的REST接口返回的JSON格式是{ "foo": "xxx", "bar": "xxx" },这个脚本就能完美适配。
  • curl的-s参数是为了屏蔽进度条输出,让接口返回的JSON更干净。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:41:52