如何在未知上层键名时从JSON数组筛选指定stack的deploymentId
解决方法
直接用这条jq命令即可满足需求:
jq -r '.s[] | .[] | select(.stack == "c_c") | .deploymentId'
命令拆解:
.s[]:获取s对象下的所有值(不管键名是什么,正好适配你不知道那个键名的场景).[]:遍历这个值对应的数组里的每一个对象元素select(.stack == "c_c"):筛选出stack字段严格等于"c_c"的对象.deploymentId:提取这些符合条件的对象中的deploymentId值
如果想要紧凑的JSON格式输出(带引号),把-r换成-c就行:
jq -c '.s[] | .[] | select(.stack == "c_c") | .deploymentId'
为什么你之前的命令不行?
你之前用了. - map(select(...)),这里的-是数组减法操作,相当于把原数组减去符合条件的元素,自然得到反结果;而去掉减号后. map(...)是错误语法,正确的数组筛选应该用map(select(...))(直接对数组操作),或者用.[]遍历后筛选,两种写法都能实现需求,比如用map的版本:
jq -r '.s[] | map(select(.stack == "c_c")) | .[] | .deploymentId'
测试结果
用你提供的JSON输入,执行上述命令后会输出:
abc
内容的提问来源于stack exchange,提问作者Vikash Raja Samuel Selvin
相关产品推荐
相关产品推荐

