如何用JMESPath根据JSON中input.group的值筛选group_data中的组?
解决JMESPath动态匹配组并验证用户成员身份的问题
问题原因
你之前的表达式失效,是因为在JMESPath的过滤条件([]?)内部,上下文是数组中的单个组对象,直接写input.group会试图在当前组对象里找input属性,而不是根节点的input。
现有结构下的解决方案
不需要修改JSON结构,只要在引用根节点变量时加上$前缀即可:
- 精确匹配目标组
用==做精确匹配(比contains更适合你的场景,避免部分匹配的问题),表达式:
group_data[?name == $input.group]
- 直接返回用户是否在组内的布尔值
把匹配组和检查成员两步合并,直接输出布尔结果:
contains(group_data[?name == $input.group].members[], $input.user)
或者用长度判断(避免空数组的情况,结果更严谨):
length(group_data[?name == $input.group && contains(members, $input.user)]) > 0
优化结构后的更优方案
如果允许修改group_data的结构,将其从数组改成以组名为键的对象,查询效率会更高:
修改后的JSON:
{ "input": { "user": "john", "group": "johns_group" }, "group_data": { "johns_group": { "members": ["john", "michael"] }, "sallys_group": { "members": ["sally", "jane"] } } }
对应的JMESPath表达式更简洁:
contains(group_data[$input.group].members[], $input.user)
内容的提问来源于stack exchange,提问作者Anderson-A
相关产品推荐
相关产品推荐

