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

如何使用jq兼容提取数组/对象两种JSON结构中的目标key值

兼容两种JSON结构的jq过滤规则写法

场景说明

Mac环境下写Shell/Bash脚本用curl调接口拿数据时,接口返回的JSON有两种可能格式:

  • 格式1:keys数组内是带key属性的对象
{
    "keys": [
      {
        "key": "1234567890"
      }
    ]
}
  • 格式2:keys数组内直接是目标字符串
{
    "keys": [
      "1234567890"
    ]
}

脚本原有取值框架为key=$(curl "接口地址" | jq '过滤规则'),需要写一套同时适配两种格式的过滤规则。

可用过滤规则

直接把jq部分替换成下面的内容即可:

-r '.keys[] | if type == "object" then .key else . end'

完整的取值命令就是:

key=$(curl "blah blah blah" | jq -r '.keys[] | if type == "object" then .key else . end')

规则逻辑解释

  • 加-r参数是为了直接输出纯字符串,不带JSON值自带的双引号,Shell变量拿到的内容可以直接使用,不会带多余的引号符号
  • .keys[]用来遍历keys数组里的每一个元素
  • 后面的分支判断做格式适配:如果遍历到的元素是对象类型(对应第一种返回格式),就取对象里的key字段值;如果元素本身是字符串(对应第二种返回格式),直接返回元素本身的值。

注意:如果确定接口返回的keys数组永远只有1个元素,上面的规则可以直接拿到目标值;如果数组可能有多个元素,规则会逐行输出所有匹配到的key值,要取第一个的话可以把规则改成.keys[0] | if type == "object" then .key else . end即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:24:22