如何在Karate API中按条件从响应提取值并存入变量
Karate 按条件提取JSON字段实现方案
你可以直接用Karate内置的JsonPath过滤或者原生JS风格的查找语法实现,不需要额外引入工具类,两种常用写法如下:
写法1:JsonPath 条件过滤(最通用)
Karate原生支持JsonPath语法,直接按属性过滤匹配的数组元素即可:
# 定义你要匹配的预期name值 * def expectName = "Sample2" # 过滤results数组里name等于预期值的所有元素,返回匹配结果数组 * def matchedList = $response.results[?(@.name == expectName)] # 如果业务上能确定name全局唯一,直接取第一个元素的目标字段存储为变量 * def targetId = matchedList[0].id * def targetEmail = matchedList[0].email # 可选:加校验避免匹配不到导致后续脚本草稿 * assert matchedList.length == 1, "未找到name字段匹配预期值的记录"
写法2:JS find 语法(适配复杂逻辑)
如果你需要写模糊匹配、多字段联合匹配这类复杂规则,直接用Karate支持的JS数组find方法即可,写法更灵活:
* def expectName = "Sample2" # 查找第一个符合匹配条件的元素 * def matchedItem = response.results.find(item => item.name == expectName) # 直接读取目标字段存为变量 * def targetId = matchedItem.id
常用扩展场景
- 模糊匹配name:判断条件改成
item.name.includes("Sample")即可匹配所有name包含Sample关键词的记录 - 提取所有匹配项的指定字段:用
filter替代find,比如response.results.filter(x => x.name.contains("Sample")).map(x => x.id)就能拿到所有匹配项的id列表 - 多条件联合匹配:比如要同时匹配name和id,判断条件写
x.name == "Sample2" && x.id == "U-456"即可
内容的提问来源于stack exchange,提问作者Smith Regan
相关产品推荐
相关产品推荐

