如何用含OR逻辑的jq一行命令获取不同层级的同名属性
用一行jq命令同时获取父级和子级的name属性
嗨,这问题其实很容易解决,有两种实用的方式可以实现你要的效果,我给你拆解清楚:
方法一:直接合并已有选择器(适合固定的父-子两层结构)
既然你已经知道单独获取父级和子级name的命令,只需要把两个选择器用逗号连接起来就行——逗号在jq里的作用是依次输出多个表达式的结果。
对应的一行命令:
jq '.[] | (.name, .children[].name)' your-data.json
原理说明
.[]遍历顶层数组里的每个对象;(.name, .children[].name)先输出当前对象的name(父级),再遍历children数组输出每个子对象的name,两者的结果会依次打印出来。
方法二:递归遍历(适合任意嵌套层级的通用场景)
如果你的JSON结构后续可能有更多层级的嵌套(比如子对象还有自己的children),可以用递归遍历的方式,一次性拿到所有层级的name:
对应的一行命令:
jq '.. | .name? // empty' your-data.json
原理说明
..是jq的递归遍历操作符,会遍历JSON中的所有元素(包括嵌套的子对象、数组等);.name?尝试获取当前元素的name属性,加?是为了避免元素没有name时抛出错误;// empty会把获取不到name时返回的null过滤掉,只保留有效的name值。
测试验证
用你提供的JSON数据:
[{ "name": "asd", "children": [ { "name": "sfgdfg" }] }]
两种命令都会输出:
"asd" "sfgdfg"
完全符合你要同时获取两类name的需求。
内容的提问来源于stack exchange,提问作者user5177570
相关产品推荐
相关产品推荐

