jq使用..递归搜索多个键时如何为输出标注对应匹配键名
实现方法
不需要为每个目标键单独执行搜索,调整递归遍历的逻辑即可,核心是遍历递归到的所有对象的键值对,筛选目标键后直接组装需要的结构,jq脚本如下:
#!/usr/bin/jq -f .. | objects | to_entries[] | select(.key == "keyA" or .key == "keyB") | {key: .key, value: .value}
逻辑说明
..保持原有的递归遍历所有节点的逻辑objects过滤掉非对象类型的节点(数组、字符串、数字等类型没有键值对,直接跳过减少无效处理)to_entries[]把当前对象拆成{key: 键名, value: 值}格式的条目流select(...)筛选出键名匹配目标keyA、keyB的条目- 最后一步直接输出你需要的结构,不需要额外转换
如果后续需要新增匹配的键,直接在select条件里补充即可;如果匹配的键数量较多,可以把判断改成数组包含的形式,维护更方便:
select(.key as $currentKey | ["keyA", "keyB", "keyC"] | index($currentKey))
用你提供的示例JSON执行上述脚本,输出结果完全符合预期:
{"key":"keyA","value":{"foo":"foo","bar":"bar"}} {"key":"keyB","value":{"A":"123","B":"c"}}
原写法无法携带键名的原因是:之前的逻辑是递归到节点后直接硬编码取.keyA?、.keyB?的值,值取出后就丢失了对应的键名上下文,自然无法直接组装带键名的结构。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

