如何编写逻辑与(AND)组合的JSONPath验证凭证?
JSONPath组合多条件验证凭证的正确写法
给定如下结构的input.json:
{ "Attributes": { "Attribute": [ { "name": "uid", "value": "account1" }, { "name": "pwd", "value": "secret" } ] } }
你已经能单独写出验证uid和pwd的JSONPath,但直接用&&连接两个路径的写法无法生效——问题在于这种写法是试图同时返回两个匹配的数组元素,而非验证整个文档同时满足两个条件。
正确的组合写法(通用兼容版)
使用根节点的过滤表达式,同时检查两个子条件是否都成立:
$[?($.Attributes.Attribute[?(@.name == 'uid' && @.value == 'account1')] && $.Attributes.Attribute[?(@.name == 'pwd' && @.value == 'secret')])]
当文档同时存在符合要求的uid和pwd属性时,该表达式会返回整个根对象;若任一条件不满足,则返回空结果。
进阶写法(部分JSONPath实现支持)
如果使用的JSONPath引擎支持箭头函数(比如JSONPath Plus),可以用更简洁的方式验证数组元素是否覆盖两个条件:
$[?($.Attributes.Attribute.every(item => (item.name == 'uid' && item.value == 'account1') || (item.name == 'pwd' && item.value == 'secret')))]
这个写法会检查Attribute数组中的每个元素都匹配uid或pwd的规则,适合确保数组中只有这两个合法属性的场景。
原组合写法无效的原因
你之前尝试的$.Attributes.Attribute[?(@.name == 'uid' && @.value == 'account1')] && $.Attributes.Attribute[?(@.name == 'pwd' && @.value == 'secret')],本质是试图同时返回两个匹配的数组元素,而非对整个文档的合法性做判断。JSONPath的逻辑与需要包裹在同一个过滤表达式中,才能实现“两个条件同时成立”的验证逻辑。
内容的提问来源于stack exchange,提问作者Erkan
相关产品推荐
相关产品推荐

