jmeter之json提取器详解
为什么需要json提取器?
一般来说,通常提取数据我们使用的都是(正则表达式提取),无论任何格式的数据都能提取,属于万能提取器,但一般用作于取值单一数据,就是取值某一个键值对的数据,当然也可以提取多个,但表达式比较繁多复杂
json提取器用作于返回格式为json格式的数据,语法简单简洁,适用于取值多个键值对数据。
json提取器:
json提取是jmeter自带的,建议不要下载插件。路径为(后置处理器)>(json提取器)
注意:网上的一些json path解析器最好不要用,最好用jmeter自带的。因为某些网站并不能很好解析json path语法。
json提取器功能讲解:
Apply to:(应用范围)可以参照(正则表达式提取器)
Main sample and sub-samples:主样本和子样本
Main sample only:主要样本;一般用这个就行了
Sub-samples only:仅子样本
Jmeter Variable Name to use:用作jmeter变量名;可以提取(上一个json提取器中提所取的值),记得写上一个json返回值的变量名,注意不用写格式
Name of created variables:创建的变量名称,用户自定义,用于储存值,可以多个,用分号(;)进行分隔。
JSON Path expressions:json path表达式,用户匹配数据,可以填写多个,要求与变量名数量一致,用分号(;)进行分隔。
Match NO.(0 fon Random):为空的默认值是0,(0代表随机、-1代表所有、其它则从1开始,1则代表取值第1个,2则代表取值第2个,类推。。。)
Compute conxatenation var (suffix_ALL):该选项如果勾选,则将所有的值用逗号拼接,并保存到一个变量中。注意只有Match NO为 -1 时该功能打钩才有效果。
Defaylt Values:默认值,用户自定义,可以多个,注意当变量名为多个时,默认值也要求多个,否则无法接口不运行无法查看结果树。
Json path语法讲解:
$ 根节点,表示json整个对象。某种意义上来讲 $. 可以省略,但不建议省略,保证语法完整。
. 点,表示用来连接父、子节点。格式:key.key
[] 下标运算符,根据索引获取元素,也可以用来连接父、子节点。格式key["key2"]
一般来说,使用 [] 可以提取多个子节点作为一个子JSON对象。格式$["key","key2"]
.. 递归匹配所有子元素,表示提取所有节点、子节点中符合条件的节点值。格式$..
* 表示通配,提取所有。
$.* 表示提取根节点之下的所有节点(儿子)
$..* 表示提取根节点之下所有子节点(子子孙孙,不限于儿子)
$.key.key2 key2是一个数组,表示提取key下key2的值,结果是一个数组。
$.key.key2[*] 表示提取key下的key2中的所有元素的值,结果是一个元素。
@ 表示当前节点,即表示自己。
数组的处理:
数组的处理一般来说,可以通过 (下标) 来提取数组元素。$.key.key2[*]
$.key.key2[自然数],0表示第一个,1表示第2个,以此类推
可以通过枚举的方式,一次提取多个元素。格式:数组[N1,N2,,,,,,,NN]。示例$key.key2[0,2,3]
取数组第一个值:$.key.key2[0]
切片:
格式:[S:E]
表示提取数组中下标从S开始(包含S),到E(不包含E)结束的所有元素的值。
示例:$.key.key1[0:2],表示提取$.key.key1[0],$.key.key1[1] 这两个值。
示例2:$.key.key1[1:3],表示提取$.key.key1[1],$.key.key1[2] 这两个值
S和E可以为空,也可以为负数
如果S为空,则表示S默认值是0
示例:$.key.key2[:3], 等价与$.key.key2[0:3]
如果E为空,则表示取值到最后一个元素(包含)。
示例:$.key.key2[1:],表示从下标1开始,取值到最后一个元素
如果S和E是负数,表示倒数第N个元素
示例:$.key.key2[:-1],表示获取除了最后一个元素以外的所有值,也就是从最后一个开始数,不要最后一个,其余都要。如果是-2,也就是后面开始数,最后2个不要,其余都要
示例2:$.key.key2[-2:],表示获取最后两个元素的值,如果是-1,则获取最后1个元素。类推
通过切片取第一个值: $.key.key1[:1]
通过切片取倒数第一个值:$.key.key1[-1:]
过滤表达式:
格式:数组[?(过滤表达式)]
示例:$.key.key2[?(@.key=="values")]、表示获取key 等于“values”的值
也可以$.key.key2[?(@.key=="values")].key3、表示获取key等于values的值的key3字段值
示例2:$.key.key2[?(@.key!="values")]、表示获取key 不等于“values”的值
操作符:==、!=、<、<=、>、>=
== 恒等于,要求数据与数据格式一致
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
操作符2:=~、in、nin、||、&&、subsetof
=~ 正则匹配,也叫模糊匹配,
示例需求1:查找学生中姓张的学生,则可以写成 $.key.keu2[?(@.name=~/张.*/)]。小知识,这里的*也可以用+代替
示例需求2:查找学生中姓张的学生,且后面只有1个的字,则可以写成$.key.keu2[?(@.name=~/张.{1}/)],如果是$.key.keu2[?(@.name=~/张.{2}/)],则表示后面有2个字。
in 存在于
示例需求:查找学生中年龄等于20或等于25的学生,则可以写成 $.key.keu2[?(@.age in ["20","25"])]。等价于$.key.keu2[?(@.age == "20" || @.age=="25"])]
nin 不存在于
示例需求:查找学生中年龄不等于20且不等于25的学生,则可以写成$.key.keu2[?(@.age nin ["20","25"])]。等价于$.key.keu2[?(@.age != "20" && @.age!="25"])]
|| 或则。上面已经演示了
&& 并且。上面已经演示了
subsetof 子集
示例:$.key.key2[?(@.key subsetof ["key3","key4","key5"])]。表示获取
额外小需求:查询所有科目都及格的学生,则可以写成$.key.key2[?(@.key age.min()>=60)]。age.min是一个数组。
到此讲解结束!