如何用jq或CEL筛选含city_x的嵌套JSON payload.*节点
使用jq筛选符合条件的JSON节点
核心需求
筛选JSON结构中payload下的所有节点,要求该节点的任意子节点的cities数组中,存在name值为city_x的元素。无论输入的嵌套结构如何,最终输出结果需保持一致。
通用jq解决方案
直接使用递归遍历+条件筛选的jq表达式即可实现需求:
.payload[] | select(.. | .cities? | any(.[]; .name == "city_x"))
表达式拆解
.payload[]:遍历payload下的所有直接子节点select(...):仅保留满足条件的节点.. | .cities?:递归遍历当前节点的所有后代元素,获取所有存在的cities数组(?用于忽略无cities属性的节点,避免报错)any(.[]; .name == "city_x"):检查cities数组中是否存在至少一个元素的name等于city_x,只要有一个满足就返回true
示例验证
示例输入1(深层嵌套结构)
{ "payload": [ { "id": "node1", "details": { "cities": [{"name": "city_a"}, {"name": "city_x"}] } }, { "id": "node2", "info": { "subinfo": { "cities": [{"name": "city_b"}] } } } ] }
执行jq命令后输出:
{ "id": "node1", "details": { "cities": [{"name": "city_a"}, {"name": "city_x"}] } }
示例输入2(混合嵌套结构)
{ "payload": [ { "id": "node3", "cities": [{"name": "city_c"}, {"name": "city_x"}] }, { "id": "node4", "data": [ {"cities": [{"name": "city_d"}]}, {"other": {"cities": [{"name": "city_x"}]}} ] }, { "id": "node5", "meta": {"value": "foo"} } ] }
执行jq命令后输出:
{ "id": "node3", "cities": [{"name": "city_c"}, {"name": "city_x"}] } { "id": "node4", "data": [ {"cities": [{"name": "city_d"}]}, {"other": {"cities": [{"name": "city_x"}]}} ] }
补充说明
- 该表达式不限制
cities数组的嵌套层级,无论目标数组在节点的哪一层后代中,都能被检测到 - 如果需要严格匹配(区分大小写、精确字符串),直接使用当前表达式即可;若需模糊匹配,可将
==替换为test()函数
内容的提问来源于stack exchange,提问作者mohit nagpal
相关产品推荐
相关产品推荐

