使用jq提取id与name并批量执行curl生成对应JSON文件的问题
解决方案
核心思路
通过jq将JSON中的id和name输出为Shell可安全解析的格式,再结合Shell循环遍历每一组值,执行curl并将结果写入指定命名的文件。
方法一(推荐:兼容含特殊字符的name)
使用jq的@sh过滤器,将id和name转换为Shell安全的带引号字符串,避免因name含空格、特殊字符导致的解析错误:
# 假设输入JSON文件名为input.json,替换为你的实际文件或stdin while read -r id name; do # 替换下面的curl URL为你的实际API地址 curl -o "${name}-${id}.json" "https://your-api-endpoint.com/data/${id}" done < <(jq -r '.[] | [.id, .name] | @sh' input.json)
关键解释:
jq -r '.[] | [.id, .name] | @sh':遍历JSON数组中的每个对象,将id和name打包为数组,再用@sh转义为Shell可识别的安全格式(输出示例:'2253' 'steve')。read -r id name:Shell会自动去除引号,将两个值分别赋值给id和name变量。"${name}-${id}.json":用变量拼接生成目标文件名,确保格式符合要求。
方法二(适合无特殊字符的name)
如果确定name不含空格或特殊字符,可以用简单的分隔符(如|)来输出:
while IFS='|' read -r id name; do curl -o "${name}-${id}.json" "https://your-api-endpoint.com/data/${id}" done < <(jq -r '.[] | "\(.id)|\(.name)"' input.json)
验证jq输出
执行jq -r '.[] | [.id, .name] | @sh' input.json,会得到如下输出,确保每个对象的id和name被正确配对:
'2253' 'steve' '2363' 'mary' '2226' 'chris'
内容的提问来源于stack exchange,提问作者Trevor
相关产品推荐
相关产品推荐

