如何在Bash中遍历含空格字符的JSON对象数组
解决Bash中遍历含空格的JSON对象数组问题
问题出在Bash默认的分词规则上:如果直接用array=($(jq -c '.[]' response.json))这种方式赋值,Bash会把输出内容按空格、换行等分隔符拆分,导致带空格的JSON对象被拆成多个数组元素。
下面是两种可靠的解决方法:
方法一:用mapfile(readarray)预存数组
mapfile命令会按行读取输入,将每一行作为数组的一个独立元素,完全忽略行内的空格:
# 从API响应或本地JSON文件读取对象数组,存入Bash数组 mapfile -t json_objects < <(jq -c '.[]' response.json) # 遍历数组处理每个对象 for obj in "${json_objects[@]}"; do # 提取displayName字段示例 display_name=$(echo "$obj" | jq -r '.displayName') echo "当前对象的显示名称:$display_name" echo "完整JSON对象:$obj" done
-t选项会去掉每行末尾的换行符,避免对象里多出来不必要的换行< <(...)是进程替换,让mapfile直接读取jq命令的输出
方法二:用while read循环边读边处理
如果JSON数组很大,不想占用太多内存预存整个数组,可以用while循环逐行读取:
# 直接遍历jq输出的每一行 jq -c '.[]' response.json | while IFS= read -r obj; do display_name=$(echo "$obj" | jq -r '.displayName') echo "显示名称:$display_name" echo "完整对象:$obj" done
IFS=确保read不会忽略行首或行尾的空格-r禁止read解析转义字符,保证JSON内容的完整性
这两种方法都能保证每个JSON对象作为一个整体被处理,不会因为字段含空格而拆分。
内容的提问来源于stack exchange,提问作者Weili Gao
相关产品推荐
相关产品推荐

