如何通过Key筛选JSON并提取指定属性值?
用jq提取指定属性的值
问题场景
给定JSON数据:
[ { "source": { "file": "test", "baz": "now" } }, { "source": { "dev": "foo" } }, { "source": { "bar": "bar" } } ]
需要提取所有file或dev属性的值,预期结果是["test", "foo"]。但当前使用的jq语句只会返回完整对象:
.[].source | select(.file? or .dev?)
解决方法
直接在筛选后提取对应属性的值即可,推荐几种实用写法:
写法一(最直观)
[.[].source | select(.file? or .dev?) | .file // .dev]
- 先通过
select筛选出包含file或dev的对象 - 用
//(空值替代运算符)优先取file的值,对象里没有file就取dev的值 - 外层的
[]把所有结果打包成数组,正好符合预期输出
写法二(灵活适配多属性)
如果后续要调整目标属性,这种写法更易修改:
[.[].source | select(.file? or .dev?) | .[keys[] | select(. == "file" or . == "dev")]]
- 先筛选出目标对象,再筛选出
file或dev的属性名,最后提取对应的值 - 同样用外层
[]包裹成数组
写法三(简洁版)
如果能确定每个符合条件的对象只会有file或dev其中一个,还可以这么写:
[.[].source[] | select(keys[] | IN("file", "dev"))]
内容的提问来源于stack exchange,提问作者philipp
相关产品推荐
相关产品推荐

