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

如何用jq循环读取JSON数组对象并通过curl POST完整数据?

解决bash脚本读取JSON数组时拆分对象的问题

我太懂你踩的这个坑了——用jq配合while read循环处理JSON数组时,默认输出格式会把每个对象拆成多行,导致循环跑了N次远超出预期的数组元素数量。咱们来快速修复这个问题:

问题根源

你原来用的jq -r '.[]'会把每个JSON对象格式化输出成多行文本,而read命令默认按换行符分割输入,所以每一行都被当成了一次循环的输入,这就出现了你看到的一堆零散的行。

修复方案

只需要给jq加一个-c参数,让它输出紧凑的单行JSON——每个数组里的完整对象单独占一行,这样read就能一次读取整个对象了。

修改后的脚本如下:

declare -A values=( )
while IFS= read -r value; do
    echo "Read complete JSON object: $value" >&2
    # 直接把完整的JSON对象作为POST数据发送
    curl -d "$value" -H "Content-Type: application/json" https://example.com/api/foo
done < <(jq -c '.[]' < "$1")

关键变化说明

  1. jq -c '.[]':-c(compact的缩写)让jq不再格式化输出,而是把每个JSON对象压缩成单行,这样read就能一次性读取整个对象,循环次数正好等于数组里的元素数(3次)。
  2. curl调用优化:原来的echo $value | curl -d @-也能工作,但直接用-d "$value"更简洁高效,避免了多余的管道操作。

验证效果

修改后运行脚本,你会看到输出变成:

Read complete JSON object: {"description":"Some description","name":"Some name","summary":"Some summary. "}
Read complete JSON object: {"description":"Some description","name":"Some name","summary":"Some summary. "}
Read complete JSON object: {"description":"Some description","name":"Some name","summary":"Some summary. "}

正好3次循环,每次处理一个完整的JSON对象,完美符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:17:39