JsonPath双嵌套数组条件筛选返回结果异常问题排查
JsonPath嵌套过滤返回结果不符合预期问题修复
核心错误点
原表达式的内层过滤逻辑存在布尔判定歧义:@.origins[?(@.source=='sourceA')]返回的是匹配规则的origins节点集合(数组类型),不是明确的布尔值。主流JsonPath实现(如Jayway)的过滤器对数组类型的判定逻辑为:只要路径指向的字段存在、值不为null,就判定条件为真,不会自动判断返回的节点集合是否非空(也就是不会自动校验是否真的存在匹配source值的项)。
这就导致过滤条件实际上只校验了type == 'eMail',只要contacts的type是eMail、且带有origins字段,就会被命中,最终返回全部邮箱。
测试样例JSON
对应描述的场景结构如下:
{ "individuals": [ { "contacts": [ { "type": "eMail", "emailAddress": "sourceA@email.com", "origins": [{"source": "sourceA"}] }, { "type": "eMail", "emailAddress": "sourceB@email.com", "origins": [{"source": "sourceB"}] } ] } ] }
正确写法
替换为返回明确布尔值的包含判断,兼容所有主流JsonPath实现:
$..contacts[?(@.type == 'eMail' && @.origins[*].source contains 'sourceA')].emailAddress
逻辑说明:
- 先通过
@.origins[*].source拉取当前contact下所有origins的source字段,组成字符串数组 - 用
contains判断目标值sourceA是否在该数组内,这一步返回确定的true/false,无判定歧义 - 执行后只会返回
["sourceA@email.com"],符合预期。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

