You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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")',当遇到数组响应时:

  1. .指向整个数组,has("error")会返回false(数组没有error键)
  2. select(false)会返回null
  3. 最后对null执行has("error"),jq就会抛出类型错误,因为null不是对象或数组

通过先判断响应类型,就能完美规避这个问题啦!

内容的提问来源于stack exchange,提问作者KeterDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:05:42