如何在Shell脚本中用jq判断Web API的JSON响应是否为错误?
解决API响应类型差异的jq处理问题
这个问题我之前也碰到过!核心问题是你的jq命令没考虑到响应类型的差异——错误响应是对象,而正常响应是数组,直接对数组用has("error")肯定会报错,因为数组本身没有这个键。下面给你两种可靠的解决方案:
方案1:分步判断错误与正常响应
这种方式逻辑清晰,适合需要分别处理错误和正常数据的场景:
# 先获取API响应 response=$(curl -s "你的API接口地址") # 用jq判断是否为错误响应(对象类型且包含error字段) is_error=$(echo "$response" | jq 'type == "object" and has("error")') if [ "$is_error" = "true" ]; then # 提取错误信息并处理 error_message=$(echo "$response" | jq -r '.error') echo "API请求失败:$error_message" exit 1 # 终止脚本或执行错误处理逻辑 else # 处理正常的数组响应,比如遍历每个元素 echo "API返回正常数据:" echo "$response" | jq '.[] | {element1, element2, element3}' # 这里可以添加你的业务处理逻辑,比如提取字段存入变量等 fi
关键说明:
type == "object":先判断响应是否为对象类型(错误响应的格式),避免对数组执行has("error")导致报错-r选项:让jq返回原始字符串(不带引号),方便直接使用错误信息
方案2:单jq命令处理两种响应
如果不需要复杂的分支逻辑,只想快速区分输出,可以用jq的条件表达式一次性处理:
curl -s "你的API接口地址" | jq ' if type == "object" and has("error") then "错误:" + .error else .[] | "元素:element1=\(.element1), element2=\(.element2), element3=\(.element3)" end '
这个命令会自动识别响应类型:如果是错误对象,就输出格式化的错误信息;如果是正常数组,就遍历每个元素并格式化输出。
为什么你的原命令会失败?
你之前的命令echo ${json} | jq '. | select (.| has("error")) | has("error")',当遇到数组响应时:
.指向整个数组,has("error")会返回false(数组没有error键)select(false)会返回null- 最后对
null执行has("error"),jq就会抛出类型错误,因为null不是对象或数组
通过先判断响应类型,就能完美规避这个问题啦!
内容的提问来源于stack exchange,提问作者KeterDev
相关产品推荐
相关产品推荐

