什么是json
一般来说,符合json格式的字符串通常为:{"key":"value"},从传值效果来说,等价于key=value。
它可以有多个键值{"key1":"value1", "key2":"value2"}。
value可以是普通的字符串,也可以是数值、boolean值、数组和json对象
为什么要用json提取器
对于服务器返回的内容为json字符串时,用json提取器能够更加快速方便的获得我们所需要的数据
JSON提取器详解
Apply to,该选项是用来控制正则表达式提取器的作用对象,可选对象有三种:
main sample,主请求
sub sample,子请求
JMeter Variable,JMeter的变量
name of variables,变量名称,由用户自定义,用于存储数据
变量名称可以写多个,使用逗号进行分隔
Json Path expressions,JsonPath表达式,即用来提取数据的
该处可以填写多个JsonPath表达式,要求数量和变量名称的数量保持一致,每个表达式提取到的值将会按照位置传给变量
匹配数字,该处可以填写的数字有3种:
0,是默认值,表示随机,即将多次找到的结果随机抽取一个赋值给变量
正整数N,表示将第N次找到的结果赋值给变量
负数,一般填写-1,表示将所有找到的值以类似数组的方式存入变量数组,效果为varName_1=value1, varName_2=value2,并且同时会自动生成一个变量varName_matchNr=N用来存储值得个数
一般来说当匹配数字为-1时,就表示我们对变量数组中的值的处理诉求通常有2种:
遍历:表示一次使用一个,使用N次,一般结合foreach控制器来实现,将变量名作为输入变量前缀
allin:表示一次使用所有的值,值要按业务进行拼装,一般结合beanshell后置处理器来实现数据拼装
default values,默认值,如果变量名称只有一个,则该处可以省略,如果变量名称有多个,则该处必须有值。值的数量必须要和变量名称的数量保持一致,使用逗号分隔,一般建议填写1,1,1,...
JsonPath语法详解
基本操作符
$ 根节点
@ 当前节点,一般来说用于子表达式或者过滤表达式
. or [] 用于连接父子节点
$.key.key.key要求key的值都是json对象,才可以继续使用点号连接
[]是用来筛选子节点,构成一个新的json对象。$["data"]等价于$.data,它最主要的作用在于$["data","name"],这个表达式返回2个同级节点构成的新json对象。
.<name> Dot-notated方式,获取子节点
['<name>'(, '<name>')] Bracket-notated,获取一个或者多个子节点
.. 深层扫描,用于获取当前节点下的所有指定对象,表示从当前节点开始搜索所有的子节点
* 通配符
[<nubmber>(, <number>)] 数组索引,如果有多个用逗号分隔
[start:end] 数组切片操作
[?(<expression>)] 过滤表达式
数组操作
$.xx表示获取xx整个数组的值
$.xx[*]表示获取xx数组节点的所有元素的值
$.xx[index]表示根据下标获取xx数组节点的某个元素的值,0表示数组中的一个元素
$.xx[index1,index2,index3]表示获取xx数组的枚举下标的元素值
$.xx[start:end]表示获取的是[start,end)左闭右开区间的下标的值,若start为空则表示默认为0,即从第1个元素开始取值;若end为空则表示默认获取到最后一个元素
start和end可以为负数,如果为负数,则只能存在start或者end。负数表示倒数第N个元素。
$.xx[-2:]表示获取倒数2个元素;$.xx[:-2]表示获取除倒数2个元素之外的其它元素。
过滤表达式,是用来获取数组中符合条件的元素值的表达式
@表示数组中的当前元素
常用操作符有
==、!=、<、<=、>、>=
=~ 正则匹配
In 存在于
Nin 不存在于
Subsetof 子集
|| 或者
&& 并且
例子:
$.data.student[?(@.age>"25")].name 获取年龄大于25岁的所有学生姓名,其中服务器返回的年龄如果带双引号,那么此处要加双引号,反之不加
$.data.student[?(@.isVIP==false)] 获取不是vip的所有学生的信息
$.data.student[?(@.age>"25" || @.sex== 'male')] 获取年龄大于25岁的所有男生信息
$.data.student[?(@.grade.avg()>90)] 获取grade的平均值大于90的学生信息
$.data.student[?(@.name=~/张.*/)] 获取姓张的学生信息
$.data.student[?(@.age in ["20", "25"]] 获取年龄为20或25的学生信息
$.data.student[?(@.hobby subsetof ["book","game","football"])]
JPath函数
Min()
Max()
Avg()
Stddev()
Length()