如何用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")
关键变化说明
jq -c '.[]':-c(compact的缩写)让jq不再格式化输出,而是把每个JSON对象压缩成单行,这样read就能一次性读取整个对象,循环次数正好等于数组里的元素数(3次)。- 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
相关产品推荐
相关产品推荐

