JMESPath技术问询:如何在包含标量与列表的大型JSON中查找任意位置的指定键
使用JMESPath快速查找JSON任意层级的指定键
当然可以!JMESPath专门有语法解决这种不想写一大串嵌套路径的麻烦,不管你的JSON是多层对象嵌套,还是混着列表结构,都能轻松定位到你要的键值。
先看你给出的纯嵌套对象例子
你的示例JSON是:
{"a": {"b": {"c": {"d": {"e": {"f": {"g": {"key1": 3 }}}}}}}
不用写冗长的a.b.c.d.e.f.g.key1,用JMESPath的递归通配符..就能搞定——它会遍历所有层级的节点,匹配后面指定的键。
对应的表达式:
..key1
执行后会返回[3](返回数组是因为可能找到多个匹配项)。如果确定只有这一个匹配,想直接拿到标量值,加个[0]就行:
..key1[0]
这样就会直接返回3。
再看包含列表的复杂场景
如果你的JSON里夹杂着列表结构,比如下面这种:
{ "a": [ {"b": {"key1": 10}}, {"c": {"d": {"key1": 20}}}, {"key1": 30} ] }
同样用..key1这个表达式,会把所有层级的key1值都找出来,返回结果是[10, 20, 30]——不管键在列表元素的嵌套对象里,还是直接在列表元素上,都能精准匹配。
进阶玩法:过滤匹配结果
要是还想对找到的结果做筛选(比如只保留大于15的key1值),可以结合管道操作|和过滤表达式:
..key1|[?@ > 15]
执行后会返回[20, 30],灵活性拉满。
核心知识点
..是JMESPath的递归下降运算符,它会遍历当前JSON的所有子节点(包括对象属性和列表元素),直到找到匹配的键。- 返回结果默认是数组,因为要兼容多个匹配的情况;如果确定只有一个结果,用
[0]就能直接提取标量值。 - 这个语法不管嵌套层级有多深、有没有列表,都能通用,彻底告别冗长的路径写法。
内容的提问来源于stack exchange,提问作者Riccardo79




