如何使用JQ遍历任意深度JSON对象搜索指定关键词?
jq 全域递归关键词搜索实现方案
完全可以通过jq实现不限嵌套深度的JSON全域关键词搜索,无需预先指定键路径,核心靠jq原生的递归遍历能力实现。
核心实现命令
通用搜索命令模板如下,替换关键词即可直接使用:
jq --arg kw "你要搜索的关键词" 'with_entries(select( .value | .. | strings | test($kw) ))' 目标json文件路径
命令逻辑说明
--arg kw "关键词":将搜索词作为参数传入jq,避免特殊字符转义问题with_entries(select( ... )):遍历根对象下的所有顶层键值对,仅保留符合匹配规则的条目.value | ..:递归遍历当前条目值下的所有子节点,无论嵌套多少层对象、数组都可完整覆盖strings:仅筛选节点中的字符串类型值参与匹配,避免数字、布尔、空值类型触发匹配错误test($kw):判断字符串是否包含搜索关键词,支持正则匹配;如果需要不区分大小写搜索,可改为test($kw; "i"),如果需要完全精确匹配字符串,替换为== $kw即可。
效果验证
使用问题中给出的示例JSON做测试:
- 搜索关键词
horror,执行命令:
jq --arg kw "horror" 'with_entries(select( .value | .. | strings | test($kw) ))' demo.json
返回结果完全符合预期:
{ "Book1": { "Genres": [ "horror", "thriller", "drama" ], "Description": "Extremely scary book.", "Author": "Jane Doe" } }
- 搜索关键词
romantic,执行命令:
jq --arg kw "romantic" 'with_entries(select( .value | .. | strings | test($kw) ))' demo.json
返回结果符合需求:
{ "Book2": { "Genres": [ "Romance", "drama" ], "Description": "Very romantic book.", "Author": "John Doe" } }
扩展说明
- 该方案无嵌套深度限制,无论JSON结构里嵌了多少层对象、数组,都能遍历到所有字符串节点
- 如果需要筛选非顶层的匹配节点,只需要调整
with_entries对应的作用层级即可,核心递归匹配逻辑.. | strings | test($kw)可以直接复用 - 如果需要匹配数字、布尔值等非字符串内容,删除
strings筛选器,调整对应匹配规则即可,比如搜索值为2024的数字节点,可写为.. | select(. == 2024)。
内容的提问来源于stack exchange,提问作者bravesheeptribe
相关产品推荐
相关产品推荐

