如何在Bash脚本中处理Azure DevOps API返回JSON的空白问题?
解决JSON含换行导致jq解析失败的问题
问题根源
Azure DevOps API返回的JSON中,字符串字段(比如displayName)包含未转义的换行符,违反JSON语法规则,导致jq无法正确解析。
修复步骤
1. 清理JSON中的非法换行
在传递给jq之前,将字符串内的换行符替换为空格,确保JSON合法。可以用jq原生功能直接处理:
# 直接在curl响应中完成清理与解析 curl -s -H "$headers" -X GET "$policyChecksUrl" | jq -Rsl 'gsub("\n"; " ") | fromjson'
-R:将输入视为原始字符串-s:合并所有输入行为单个字符串gsub("\n"; " "):替换所有换行符为空格fromjson:将处理后的字符串转为合法JSON对象
2. 优化脚本循环(避免shell拆分问题)
原脚本用for check in $(...)会导致JSON对象被shell按空格拆分,改用while read读取jq输出更可靠:
curl -s -H "$headers" -X GET "$policyChecksUrl" | jq -Rsl 'gsub("\n"; " ") | fromjson | .value[]' | while read -r check; do echo "当前检查项:$check" # 获取configuration.id check_id=$(echo "$check" | jq -r '.configuration.id') echo "配置ID:$check_id" # 获取对应status check_status=$(echo "$check" | jq -r '.status') echo "状态:$check_status" done
3. 更高效的一次性jq处理(推荐)
无需循环,直接用jq提取所需字段:
# 输出所有ID与对应状态 curl -s -H "$headers" -X GET "$policyChecksUrl" | jq -Rsl 'gsub("\n"; " ") | fromjson | .value[] | {id: .configuration.id, status: .status}' # 筛选特定ID(比如174)的状态 curl -s -H "$headers" -X GET "$policyChecksUrl" | jq -Rsl 'gsub("\n"; " ") | fromjson | .value[] | select(.configuration.id == 174) | .status'
替代清理方案(用sed)
如果环境中jq版本不支持-R/-s参数,可使用sed替换双引号内的换行:
curl -s -H "$headers" -X GET "$policyChecksUrl" | sed ':a;N;$!ba;s/\("\([^"]*\)\n\)/"\2 /g' | jq '.'
内容的提问来源于stack exchange,提问作者sigemer
相关产品推荐
相关产品推荐

