如何在Bash中正确读取cURL请求返回的JSON数组
问题描述
通过cURL请求并经jq处理后得到如下JSON数组:
[ { "first_name" : "John", "last_name" : "Doe" }, { "first_name" : "bat", "last_name" : "man" } ]
尝试用以下代码遍历数组:
item_list=`curl "https://linkhere.com" | jq` for item in ${item_list[@]}; do echo "item is $item" done
但输出会将JSON的每个元素拆分成单独项,结果如下:
item is [ item is { item is "John": item is "Doe" item is }, ...
需要正确遍历数组中的每个对象,提取并存储first_name和last_name的值。
正确处理方式
方式1:直接提取字段并遍历
让jq将每个对象的first_name和last_name输出为逗号分隔的字符串,再用while read拆分读取:
curl "https://linkhere.com" | jq -r '.[] | "\(.first_name),\(.last_name)"' | while IFS=, read -r first last; do # 直接使用变量first和last echo "名:$first,姓:$last" # 示例:将姓名存入数组 # full_names+=("$first $last") done
-r:输出原始无引号的字符串.[]:遍历JSON数组的每个元素"\(.first_name),\(.last_name)":将两个字段用逗号拼接,便于read命令拆分
方式2:逐个处理JSON对象
如果需要保留对象的完整结构,让jq输出单行格式的单个对象,再循环解析每个对象:
curl "https://linkhere.com" | jq -c '.[]' | while read -r item_json; do first_name=$(echo "$item_json" | jq -r '.first_name') last_name=$(echo "$item_json" | jq -r '.last_name') echo "名:$first_name,姓:$last_name" # 后续业务逻辑 done
-c:输出紧凑的单行JSON,避免换行导致的错误拆分
内容的提问来源于stack exchange,提问作者lem
相关产品推荐
相关产品推荐

