如何使用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
相关产品推荐
相关产品推荐

