如何使用jq仅针对树形JSON对象的叶子节点进行过滤与展平?
用jq提取树形JSON的叶子节点并展平
没问题,我帮你搞定这个需求!要提取树形JSON里的所有叶子节点(也就是没有nodes子节点的节点),并只保留它们的name字段组成数组,用下面这个jq命令就可以完美实现:
jq '[.. | select(has("name") and (has("nodes") | not)) | {name}]'
命令拆解说明:
..:递归遍历整个JSON结构的所有节点,不管它在树的哪一层select(has("name") and (has("nodes") | not)):筛选出同时满足两个条件的节点:- 包含
name字段(确保是我们要的节点类型) - 不包含
nodes字段(这就是定义里的“叶子节点”)
- 包含
{name}:把筛选出来的节点只保留name字段,构造成新的对象- 外层的
[]:把所有符合条件的对象收集成一个数组,就是你要的输出格式
示例验证
把你提供的JSON对象作为输入:
{ "name": "root", "nodes": [ {"name": "foo1"}, {"name": "foo2", "nodes": [{"name": "bar"}]} ] }
运行上面的jq命令后,输出结果完全符合你的预期:
[{"name": "foo1"}, {"name": "bar"}]
如果你的实际场景中,叶子节点的定义是nodes为空数组(而不是完全没有nodes字段),只需要把筛选条件改成select(has("name") and (.nodes | length == 0))就可以适配啦!
内容的提问来源于stack exchange,提问作者Milad
相关产品推荐
相关产品推荐

