macos monterey 12.3 起自带 jq,配合 curl 可直接解析 json;推荐使用 -r 输出原始值,需防护空响应或无效 json,复杂场景可选 python。
macos 自带 jq(从 macos monterey 12.3 起预装),所以解析 json 接口响应数据非常直接,无需额外安装就能开箱即用。
用 curl + jq 提取字段最常用也最可靠
这是绝大多数场景的首选方式。先用 curl 获取响应,再用 jq 精准提取:
- 获取简单字段:
response=$(curl -s "https://httpbin.org/get")<br>status=$(echo "$response" | jq -r '.status_code')
- 处理嵌套结构:
origin=$(echo "$response" | jq -r '.headers."User-Agent"') - 提取数组中满足条件的值:
ip_list=$(curl -s "https://api.ipify.org?format=json" | jq -r '.ip')
注意 jq 的 -r 选项避免引号干扰
如果不加 -r,jq 默认输出带双引号的 JSON 字符串(如 "192.168.1.1"),在 Shell 中赋值给变量后可能引发后续命令出错。加了 -r 才输出原始文本(如 192.168.1.1),可直接用于判断或拼接。
例如:if [ "$(curl -s https://api.example.com/health | jq -r '.ok')" = "true" ]; then echo "healthy"; fi
应对空响应或错误状态码要加防护
API 可能返回空体、非 JSON 或 HTTP 错误(如 404/500),但 curl -s 不报错,jq 遇到无效 JSON 会报错并退出。建议组合检查:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 先确认响应非空:
[ -z "$response" ] && echo "no response" && exit 1 - 再验证是否为合法 JSON:
echo "$response" | jq empty >/dev/null 2>&1 || { echo "invalid JSON"; exit 1; } - 或一步到位:
value=$(echo "$response" | jq -r 'try .data.id catch ""')——try/catch在解析失败时返回空字符串,不会中断脚本
复杂结构或大文件可考虑 Python 作为备选
当 JSON 极其庞大(百 MB 级)、含深层嵌套或需流式读取时,jq 可能内存吃紧。此时可用系统自带的 python3:
ip=$(curl -s https://api.ipify.org?format=json | python3 -c "import sys, json; print(json.load(sys.stdin).get('ip', ''))")
优势是语法直观、容错性强;缺点是启动解释器稍慢,且依赖 Python 环境(不过 macOS 12.0+ 默认带 Python 3.8+)。










