Karate框架问题:无法从响应中获取含2个元素的channel_definitions列表
在Karate中筛选符合特定条件的第一个channel_definitions数组
正确的JSONPath写法
可以使用带条件过滤的JSONPath表达式,直接定位到目标数组:
def targetChannelDef = karate.jsonPath(response, "$[?(@.channel_definitions.length() == 2 && @.channel_definitions[?(@.mode == 'THE FIRST MODE' && @.name == \"Maddy's life ***********\")] && @.channel_definitions[?(@.mode == 'THE SECOND MODE' && @.name == ' *********** computer')])].channel_definitions[0]")
表达式拆解
$[?()]:遍历根数组中的每个对象,筛选满足内部条件的对象@.channel_definitions.length() == 2:确保目标数组包含恰好2个元素@.channel_definitions[?(@.mode == 'THE FIRST MODE' && @.name == \"Maddy's life ***********\")]:检查数组中存在mode为THE FIRST MODE且name匹配的元素(注意单引号用双引号包裹转义)@.channel_definitions[?(@.mode == 'THE SECOND MODE' && @.name == ' *********** computer')]:检查数组中存在mode为THE SECOND MODE且name匹配的元素.channel_definitions[0]:提取第一个符合条件的对象的channel_definitions数组
更直观的Karate JavaScript写法
如果觉得JSONPath语法复杂,也可以用Karate支持的JavaScript数组方法实现:
def targetChannelDef = response.filter(item => item.channel_definitions.length == 2 && item.channel_definitions.some(c => c.mode == 'THE FIRST MODE' && c.name == "Maddy's life ***********") && item.channel_definitions.some(c => c.mode == 'THE SECOND MODE' && c.name == ' *********** computer') )[0].channel_definitions
分析你之前的错误写法
$..channel_definitions== '#[2]':不符合JSONPath语法规则,无法正确判断数组长度$..channel_definitions[2]:这是尝试取所有channel_definitions数组的第3个元素(索引从0开始),并非筛选长度为2的数组
内容的提问来源于stack exchange,提问作者Alicya
相关产品推荐
相关产品推荐

