irpas技术客

JMeter之Json提取器及JsonPath语法详解_锅锅聊软测_json提取器

网络投稿 3388

Json数据的组织格式:

一般来说,Json的基本格式为: {"key":"value"} 等价于:key=value

PS:

在一个json对象中,可以有多个key,使用逗号进行分隔。value可以是字符串、数字、布尔值、数组、json对象。

JsonPath语法详解: 基本操作符

$ 根节点 @ 当前节点,一般来说用于子表达式或者过滤表达式。 . Or [] ?用于连接父子节点 . Dot-notated方式,获取子节点。 [‘’ (, ‘’)] Bracket-notated,获取一个或者多个子节点。 .. 深层扫描,用于获取当前节点下的所有指定对象。

* 通配符 [ (, )] 数组索引,如果有多个用逗号分隔。 [start:end] 数组切片操作 [?()] 过滤表达式

假设服务器返回的响应为:

{"name":"testingedu","data":{"student":[{"id":"1","name":"张三","age":"20","sex":"male","isVIP":true,"hobby":["book","game"],"grade":[90,100,95]},{"id":"2","name":"张三疯","age":"25","sex":"female","isVIP":false,"hobby":["book"],"grade":[60,80,95]},{"id":"3","name":"李四","age":"26","sex":"male","isVIP":false,"hobby":["football","game"],"grade":[10,100,20]},{"id":"4","name":"王五","age":"30","sex":"female","isVIP":true,"hobby":["book","travel","music"],"grade":[80,91,85]}],"teacher":[{"id":"1","name":"土匪","age":"40","sex":"male","adpet":["jmeter","性能测试"]},{"id":"2","name":"will","age":"28","sex":"male","adpet":["python","自动化"]},{"id":"3","name":"roy","age":"28","sex":"male","adpet":["java","自动化"]}]},"expectage":"25"} $ 根节点,表示提取所有的json对象。

示例:

$ 表示提取整个json对象。

?结果为:

{"name":"testingedu","data":{"student":[{"id":"1","name":"张三","age":"20","sex":"male","isVIP":true,"hobby":["book","game"],"grade":[90,100,95]},{"id":"2","name":"张三疯","age":"25","sex":"female","isVIP":false,"hobby":["book"],"grade":[60,80,95]},{"id":"3","name":"李四张","age":"26","sex":"male","isVIP":false,"hobby":["football","game"],"grade":[10,100,20]},{"id":"4","name":"王五","age":"30","sex":"female","isVIP":true,"hobby":["book","travel","music"],"grade":[80,91,85]}],"teacher":[{"id":"1","name":"土匪","age":"40","sex":"male","adpet":["jmeter","性能测试"]},{"id":"2","name":"will","age":"28","sex":"male","adpet":["python","自动化"]},{"id":"3","name":"roy","age":"28","sex":"male","adpet":["java","自动化"]}]},"expectage":"25"} . 用于连接父子节点

示例: $.name 表示提取根节点下的name节点的值。

结果为:

testingedu

$.data.student 表示提取根节点下的data节点下的student节点的值。

结果为:

[{"sex":"male","grade":[90,100,95],"name":"张三","id":"1","age":"20","isVIP":true,"hobby":["book","game"]},{"sex":"female","grade":[60,80,95],"name":"张三疯","id":"2","age":"25","isVIP":false,"hobby":["book"]},{"sex":"male","grade":[10,100,20],"name":"李四张","id":"3","age":"26","isVIP":false,"hobby":["football","game"]},{"sex":"female","grade":[80,91,85],"name":"王五","id":"4","age":"30","isVIP":true,"hobby":["book","travel","music"]}]

$.data.student[*] 表示提取数组student中的所有元素的值。

结果有四个:

Result[0]={"sex":"male","grade":[90,100,95],"name":"张三","id":"1","age":"20","isVIP":true,"hobby":["book","game"]}Result[1]={"sex":"female","grade":[60,80,95],"name":"张三疯","id":"2","age":"25","isVIP":false,"hobby":["book"]}Result[2]={"sex":"male","grade":[10,100,20],"name":"李四张","id":"3","age":"26","isVIP":false,"hobby":["football","game"]}Result[3]={"sex":"female","grade":[80,91,85],"name":"王五","id":"4","age":"30","isVIP":true,"hobby":["book","travel","music"]}

?[]也可以用来提取子节点的值。

用法:

示例: $["data"]["student"]

等价于$.data.student,结果为:

Result[0]=[{"sex":"male","grade":[90,100,95],"name":"张三","id":"1","age":"20","isVIP":true,"hobby":["book","game"]},{"sex":"female","grade":[60,80,95],"name":"张三疯","id":"2","age":"25","isVIP":false,"hobby":["book"]},{"sex":"male","grade":[10,100,20],"name":"李四张","id":"3","age":"26","isVIP":false,"hobby":["football","game"]},{"sex":"female","grade":[80,91,85],"name":"王五","id":"4","age":"30","isVIP":true,"hobby":["book","travel","music"]}]

区别:

"."只能连接一个子节点,而[]可以选择多个子节点构成一个新的json结果集。

示例:

$["name","expectage"]

结果为:

Result[0]={"name":"testingedu","expectage":"25"}

.. 深层扫描,用于获取当前节点下的所有指定对象。

.. 在jsonpath中,相当于xpaht中的“//”。

示例:

$..name

表示提取根节点下及其所有的子节点中的name节点的值。

结果有8个:

Result[0]=testingeduResult[1]=土匪Result[2]=willResult[3]=royResult[4]=张三Result[5]=张三疯Result[6]=李四张Result[7]=王五

$.data..name

表示提取$.data节点下及其所有的子节点下的name节点的值。

结果有7个:

Result[0]=土匪Result[1]=willResult[2]=royResult[3]=张三Result[4]=张三疯Result[5]=李四张Result[6]=王五

?* 通配符

通配符,表示所有。

示例:

$.*

表示提取根节点下的所有节点的值。

结果有三个:

Result[0]={"student":[{"sex":"male","grade":[90,100,95],"name":"张三","id":"1","age":"20","isVIP":true,"hobby":["book","game"]},{"sex":"female","grade":[60,80,95],"name":"张三疯","id":"2","age":"25","isVIP":false,"hobby":["book"]},{"sex":"male","grade":[10,100,20],"name":"李四张","id":"3","age":"26","isVIP":false,"hobby":["football","game"]},{"sex":"female","grade":[80,91,85],"name":"王五","id":"4","age":"30","isVIP":true,"hobby":["book","travel","music"]}],"teacher":[{"sex":"male","name":"土匪","adpet":["jmeter","性能测试"],"id":"1","age":"40"},{"sex":"male","name":"will","adpet":["python","自动化"],"id":"2","age":"28"},{"sex":"male","name":"roy","adpet":["java","自动化"],"id":"3","age":"28"}]}Result[1]=testingeduResult[2]=25 数组的处理

一般来说,针对数组节点我们能够采用的方式主要有:

下标提取。过滤表达式。

下标提取

提取一个。 数组中第一个元素的下标是0,第二个是1,依次类推。

$.data.student[*] 表示提取数组student中的所有元素的值。

$.data.student[0] 表示提取数组student中的第一个元素的值。

结果为:

Result[0]={"sex":"male","grade":[90,100,95],"name":"张三","id":"1","age":"20","isVIP":true,"hobby":["book","game"]}

$.data.student[3] 表示提取数组student中的第四个元素的值。

结果为:

Result[0]={"sex":"female","grade":[80,91,85],"name":"王五","id":"4","age":"30","isVIP":true,"hobby":["book","travel","music"]}

枚举方式

array[index1,index2,...,indexN]

示例:

$.data.student[0,3] 表示提取数组student中的第一个和第四个元素的值。

结果为:

Result[0]={"sex":"male","grade":[90,100,95],"name":"张三","id":"1","age":"20","isVIP":true,"hobby":["book","game"]}Result[1]={"sex":"female","grade":[80,91,85],"name":"王五","id":"4","age":"30","isVIP":true,"hobby":["book","travel","music"]}

?分片

格式:

array[Start:End]

表示提取数组中半闭半开区间的值,即包含Start,不包含end的下标元素的值。

?示例:

$.data.student[0:1] 表示提取数组中[0,1)下标元素的值,即下标0的值。

结果为:

Result[0]={"sex":"male","grade":[90,100,95],"name":"张三","id":"1","age":"20","isVIP":true,"hobby":["book","game"]}

$.data.student[1:3] 表示提取数组中[1,3)下标元素的值,即下标1和2的值。

结果为:

Result[0]={"sex":"female","grade":[60,80,95],"name":"张三疯","id":"2","age":"25","isVIP":false,"hobby":["book"]}Result[1]={"sex":"male","grade":[10,100,20],"name":"李四张","id":"3","age":"26","isVIP":false,"hobby":["football","game"]}

如果Start为空,则表示从0开始。

如果End为空,则表示从Start开始到结束的所有下标。

示例:

$.data.student[:3] 等价于$.data.student[0:3]

$.data.student[1:] 表示提取数组中从下标1开始到最后一个元素的值。

结果为:

Result[0]={"sex":"female","grade":[60,80,95],"name":"张三疯","id":"2","age":"25","isVIP":false,"hobby":["book"]}Result[1]={"sex":"male","grade":[10,100,20],"name":"李四张","id":"3","age":"26","isVIP":false,"hobby":["football","game"]}Result[2]={"sex":"female","grade":[80,91,85],"name":"王五","id":"4","age":"30","isVIP":true,"hobby":["book","travel","music"]}

?特殊格式:

arrary[:负数]

arrary[负数:]

负数下标表示倒数第N个元素,即-1就表示倒数第一个元素,-2表示倒数第二个元素。

?示例:

$.data.student[:-1] 表示提取数组中除了最后一个元素以外的所有元素。

结果为:

Result[0]={"sex":"male","grade":[90,100,95],"name":"张三","id":"1","age":"20","isVIP":true,"hobby":["book","game"]}Result[1]={"sex":"female","grade":[60,80,95],"name":"张三疯","id":"2","age":"25","isVIP":false,"hobby":["book"]}Result[2]={"sex":"male","grade":[10,100,20],"name":"李四张","id":"3","age":"26","isVIP":false,"hobby":["football","game"]}

$.data.student[-2:] 表示提取数组中最后两个元素。

结果为:

Result[0]={"sex":"male","grade":[10,100,20],"name":"李四张","id":"3","age":"26","isVIP":false,"hobby":["football","game"]}Result[1]={"sex":"female","grade":[80,91,85],"name":"王五","id":"4","age":"30","isVIP":true,"hobby":["book","travel","music"]}

$.data.student[-3:-1] 表示提取数组中倒数第三和倒数第二个元素。

结果为:

Result[0]={"sex":"female","grade":[60,80,95],"name":"张三疯","id":"2","age":"25","isVIP":false,"hobby":["book"]}Result[1]={"sex":"male","grade":[10,100,20],"name":"李四张","id":"3","age":"26","isVIP":false,"hobby":["football","game"]}

过滤表达式

对于复杂的业务需求,我们可以通过过滤表达式的方式来对数组的元素进行过滤,从而获取我们要的值。

常用的操作符: ==、!=、<、<=、>、>= =~ 正则匹配 In 存在于 Nin 不存在于 Subsetof 子集

|| 或者 && 并且

?语法格式为:

array[?(过滤表达式)]

在过滤表达式中,一般会使用@来表示当前对象。

示例: $.data.student[?(@.isVIP==true)] student是一个数组节点,数组的值是json对象。 获取的是isVIP=true的数组元素。

结果为:

Result[0]={"sex":"male","grade":[90,100,95],"name":"张三","id":"1","age":"20","isVIP":true,"hobby":["book","game"]}Result[1]={"sex":"female","grade":[80,91,85],"name":"王五","id":"4","age":"30","isVIP":true,"hobby":["book","travel","music"]}

$.data.student[?(@.isVIP!=true)]

结果为:

Result[0]={"sex":"female","grade":[60,80,95],"name":"张三疯","id":"2","age":"25","isVIP":false,"hobby":["book"]}Result[1]={"sex":"male","grade":[10,100,20],"name":"李四张","id":"3","age":"26","isVIP":false,"hobby":["football","game"]}

$.data.student[?(@.age>="25")] 表示提取年龄大于等于25的student对象。

结果为:

Result[0]={"sex":"female","grade":[60,80,95],"name":"张三疯","id":"2","age":"25","isVIP":false,"hobby":["book"]}Result[1]={"sex":"male","grade":[10,100,20],"name":"李四张","id":"3","age":"26","isVIP":false,"hobby":["football","game"]}Result[2]={"sex":"female","grade":[80,91,85],"name":"王五","id":"4","age":"30","isVIP":true,"hobby":["book","travel","music"]}

$.data.student[?(@.age>="25" && @.sex=="female") ] 表示提取年龄大于等于25且性别为"female"的student对象。

结果为:

Result[0]={"sex":"female","grade":[60,80,95],"name":"张三疯","id":"2","age":"25","isVIP":false,"hobby":["book"]}Result[1]={"sex":"female","grade":[80,91,85],"name":"王五","id":"4","age":"30","isVIP":true,"hobby":["book","travel","music"]}

=~ 表示通过正则的方式来过滤。。

写法为:array[?(@.key =~ /正则表达式/)]

示例:

$.data.student[?(@.name =~ /张.*/)] 表示提取student中姓张的学生的信息。

结果为:

Result[0]={"sex":"male","grade":[90,100,95],"name":"张三","id":"1","age":"20","isVIP":true,"hobby":["book","game"]}Result[1]={"sex":"female","grade":[60,80,95],"name":"张三疯","id":"2","age":"25","isVIP":false,"hobby":["book"]}

$.data.student[?(@.name =~ /.*张.*/)] 表示提取student中姓名包含字符"张"的学生的信息。

结果为:

Result[0]={"sex":"male","grade":[90,100,95],"name":"张三","id":"1","age":"20","isVIP":true,"hobby":["book","game"]}Result[1]={"sex":"female","grade":[60,80,95],"name":"张三疯","id":"2","age":"25","isVIP":false,"hobby":["book"]}Result[2]={"sex":"male","grade":[10,100,20],"name":"李四张","id":"3","age":"26","isVIP":false,"hobby":["football","game"]}

$.data.student[?(@.name =~ /张.{1}/)] 表示提取student中姓张X的学生的信息。

结果为:

Result[0]={"sex":"male","grade":[90,100,95],"name":"张三","id":"1","age":"20","isVIP":true,"hobby":["book","game"]}

in 表示存在于指定的数组中

示例:

data.student[?(@.age in ["25","26"])]

等价于

data.student[?(@.age=="25" || @.age=="26")]

nin 表示不存在于

.data.student[?(@.age nin ["25","26"])]

等价于

data.student[?(@.age!="25" && @.age!="26")]

subSetof

表示某一个数组节点的值是指定的数组的子集。

示例:

$.data.student[?(@.hobby subsetof ["book","game","football"])] 表示提取student中,爱好为["book","game","football"]的子集的学生信息。

结果为:

Result[0]={"sex":"male","grade":[90,100,95],"name":"张三","id":"1","age":"20","isVIP":true,"hobby":["book","game"]}Result[1]={"sex":"female","grade":[60,80,95],"name":"张三疯","id":"2","age":"25","isVIP":false,"hobby":["book"]}Result[2]={"sex":"male","grade":[10,100,20],"name":"李四张","id":"3","age":"26","isVIP":false,"hobby":["football","game"]}

Json提取器详解

Apply to:

用来指定Json提取器的作用对象,可选对象有三个:

Main sample:主请求Sub sample:子请求Jmeter Variable:Jmeter变量

详细用法请参照Jmeter的正则表达式提取器使用详解。

Names of created variables:

变量名称s,该处可以填写一个or多个变量名称。

注意事项:

如果有多个变量名称,使用分号";"作为分隔符。变量名称的数量要和下方的JsonPath表达式的数量保持一致。 JSON Path expressions:

JsonPath表达式,即用来提取Json对象中的值的表达式。

注意事项:

JsonPath表达式可以填写多个,使用分号";"作为分隔符。JsonPath表达式的数量要求和变量名称数量保持一致。

Match No:

匹配数字,可以填写的有三类数字:

0 随机,如果不填写or填写错误,则默认也是0。N 正整数N,用来指定将多个匹配结果中的第N个值赋值给变量。负数 默认是-1,表示将所有匹配的值以类似于数组的方式存入变量。

注意事项:

如果存在多个Json Path表达式,则匹配数字也要指定多个,且使用分号进行分隔。。否则不指定的就默认使用0.

Compute concatenation var(suffix_aALL):

表示使用逗号作为分隔符,将所有匹配到的值连接为一个变量。

示例:

Default value:

默认值,即表示如果JsonPath表达式没有找到值,则将默认值赋值给变量。

注意事项:

如果变量名称只有一个,则默认值可以不填。如果变量名称有多个,则默认值必须填写,且数量要求和变量名称保持一致,使用分号";"作为分隔符。

?

若有收获,就点个赞吧


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #json提取器 #根节点 #or