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.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。 |