如何移除JSON数组中的尾随逗号(Bash脚本场景)
解决Bash脚本生成JSON时的尾随逗号问题
方法一:先拼接数组再移除末尾逗号
不用在printf里给每个元素加逗号,先把数组元素转换成带双引号的字符串,再用替换或工具拼接成逗号分隔的格式:
# 处理images数组:先给每个元素加双引号,再把相邻双引号替换成"," imgStr=$(printf '"%s"' "${imgArray[@]}") imgStr=${imgStr//\"\"/\",\"} # 处理type数组同理 typeStr=$(printf '"%s"' "${typeArray[@]}") typeStr=${typeStr//\"\"/\",\"} # 生成最终JSON json=$(printf '{"itemName":"%s","images":[%s],"type":[%s],"link":"/"}' "$itemName" "$imgStr" "$typeStr")
或者用paste命令更简洁:
# 把数组元素每行输出一个,再用paste用逗号连接 imgStr=$(printf '"%s"\n' "${imgArray[@]}" | paste -sd ',') typeStr=$(printf '"%s"\n' "${typeArray[@]}" | paste -sd ',') json=$(printf '{"itemName":"%s","images":[%s],"type":[%s],"link":"/"}' "$itemName" "$imgStr" "$typeStr")
方法二:用sed移除已生成的尾随逗号
如果不想改动原有的数组拼接逻辑,可以在生成JSON后,用sed批量替换掉数组末尾的逗号:
# 先按原逻辑生成带尾随逗号的JSON json=$(printf '{"itemName":"%s","images":[%s],"type":[%s],"link":"/"}' "$itemName" "$(printf '"%s",' "${imgArray[@]%,}")" "$(printf '"%s",' "${typeArray[@]}")") # 把所有`",]`模式替换成`]`,去掉数组最后一项的尾随逗号 json=$(echo "$json" | sed 's/",]/"]/g')
方法三:用jq生成JSON(推荐)
手动拼接JSON很容易踩坑(比如特殊字符未转义),用jq工具可以安全可靠地生成标准JSON,彻底避免尾随逗号问题:
json=$(jq -n \ --arg name "$itemName" \ --argjson images "$(printf '%s\n' "${imgArray[@]}" | jq -R . | jq -s .)" \ --argjson types "$(printf '%s\n' "${typeArray[@]}" | jq -R . | jq -s .)" \ '{itemName: $name, images: $images, type: $types, link: "/"}')
jq会自动处理数组拼接、特殊字符转义,完全符合JSON规范。
内容的提问来源于stack exchange,提问作者Ian Jackson
相关产品推荐
相关产品推荐

