在Jmeter中,除了正则表达式和xpath表达式,还有一种方式也可以做关联,那就是 Json Extractor。它是利用json表达式提取出关键信息,传递变量。
Variable names : 名称
JSONPath Expression:JSON表达式
Match Numbers:0代表随机,1代表第1个,-1代表全部
Default Value:未取到值的时候默认值
我们在用jmeter做接口测试的时候,有的时候会遇到一些复杂的json响应。比如多层list嵌套时的取值
下面举例来讲解jsonpath的写法
$..Name:列出所有省份
$..Province[0].Name 提取Province中第一个list中的Name
$..[?(@.Name=='Beijing')] 筛选出省份名为Beijing的所有list数据
$.Province[:2].population 筛选前两条数据
注意:
$.Province[:2].population 是筛选出前两条数据 ;
$.Province[2].population 是排除前两条数据;
$.Province[-2].population是排除后两条数据,千万别弄混了哦~
这里做一下总结:
1: 冒号在前
:index 正序取值,取数为index
例:1 表示正序取1条数据(正数第一条)
:-index 倒序过滤,取数为index
例:-1 表示倒序过滤一条数据(倒数第一条)
2:没有冒号
index 表示顺序取index+1的值
例: 1 取第二条数据
3:冒号在后
index: 顺序过滤,取数为index
例: 1: 表示正序过滤第一条数据
-index:倒序取值,取数为index
例:-1: 表示倒序取一条数据
下面列举一个复杂的例子:
这是一个多层嵌套的jsonlist,需要提取所有cabinInfos列表下,patFlag=Y时的cabin,standardPrice和finallyPrice。
是不是听起来就很复杂?如果按照传统的正则表达式提取,那么 很难满足这里的需求了。因此就需要用到jsonpath表达式。
$..[?(@.patFlag=="Y")].["cabin","standardPrice","finallyPrice"]
注:JSON Extractor使用json path表达式匹配,可以一次取多个变量值。$表示响应的根对象。取子对象或对象的属性用. 取数组里的对象用[],数组索引从0开始
示例:
下面这个响应是一个list组,可以提取前两个list里面的Name
1:添加一个JSON Extractor表达式,分号分隔多个参数名;分号分隔多个json表达式;分号分隔多个匹配数字;分号分隔多个默认值(必填)
2:所有的个数一定要匹配,任一个不匹配该请求都不会在提取成功
也可以用表达式匹配所有值,然后用match no获取想要的值
提供一个mock接口的地址,直接访问即可
https://easy-mock.com/mock/5b88b27476b79510db917603/example/query1