未知层级嵌套JSON中用jq双select筛选dog下breed值的方法问询
递归筛选嵌套JSON中指定路径的字段值
需求说明
给定层级不固定的嵌套JSON,需要筛选出所有**属于dog节点(dog的递归层级未知,breed是dog的子节点或孙节点)**的breed字段值,组成数组。预期返回结果为["one","two"]。
问题排查
之前尝试的jq命令未命中核心逻辑:要么只检查dog节点本身是否包含breed(忽略了dog的子节点里的breed),要么遍历逻辑有误,导致无法覆盖dog下的多层嵌套场景。
解决方案
使用以下jq命令即可实现需求:
jq '[.. | .dog? // empty | .. | .breed? // empty]' myfile.json
命令解释
..:递归遍历JSON中的所有节点.dog? // empty:筛选出所有包含dog键的对象,提取dog对应的值;若节点不含dog键则忽略(// empty排除空值)- 再次使用
..:遍历每个dog对象下的所有子节点 .breed? // empty:提取所有breed字段的值;若节点不含breed键则忽略- 外层
[]:将所有提取到的breed值包装为数组
测试数据
将以下内容保存为myfile.json:
{ "alpha": { "this": { "dog": { "breed": "one", "colors": { "eyes": "blue" } } } }, "beta": { "dog": { "crazy": { "world": { "breed": "two", "colors": { "eyes": "blue" } } } } }, "charlie": { "format": { "bird": { "boat": { "breed": "three", "colors": { "eyes": "blue" } } } } } }
执行命令后,输出结果为:
["one","two"]
内容的提问来源于Stack Exchange,提问作者Art Vanderlay
相关产品推荐
相关产品推荐

