Json数据的组织格式:
一般来说,Json的基本格式为:
{“key”:”value”}
等价于:key=value
PS:
JsonPath语法详解:
基本操作符
$ 根节点
@ 当前节点,一般来说用于子表达式或者过滤表达式。
. Or [] 用于连接父子节点
. Dot-notated方式,获取子节点。
[‘’ (, ‘’)] Bracket-notated,获取一个或者多个子节点。
.. 深层扫描,用于获取当前节点下的所有指定对象。
* 通配符
[ (, )] 数组索引,如果有多个用逗 分隔。
[start:end] 数组切片操作
[?()] 过滤表达式
假设服务器返回的响应为:
$ 根节点,表示提取所有的json对象
示例:
$ 表示提取整个json对象。
结果为:
用于连接父子节点
示例:
$.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]=testingedu
- Result[1]=土匪
- Result[2]=will
- Result[3]=roy
- Result[4]=张三
- Result[5]=张三疯
- Result[6]=李四张
- Result[7]=王五
$.data..name
表示提取$.data节点下及其所有的子节点下的name节点的值。
结果有7个:
- Result[0]=土匪
- Result[1]=will
- Result[2]=roy
- Result[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]=testingedu
- Result[2]=25
数组的处理
一般来说,针对数组节点我们能够采用的方式主要有:
下标提取
$.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提取器的作用对象,可选对象有三个:
详细用法请参照Jmeter的正则表达式提取器使用详解。
Names of created variables:
变量名称s,该处可以填写一个or多个变量名称。
注意事项:
- 如果有多个变量名称,使用分 ”;”作为分隔符。
- 变量名称的数量要和下方的JsonPath表达式的数量保持一致。
JSON Path expressions:
JsonPath表达式,即用来提取Json对象中的值的表达式。
注意事项:
- JsonPath表达式可以填写多个,使用分 ”;”作为分隔符。
- JsonPath表达式的数量要求和变量名称数量保持一致。
Match No:
匹配数字,可以填写的有三类数字:
注意事项:
如果存在多个Json Path表达式,则匹配数字也要指定多个,且使用分 进行分隔。。否则不指定的就默认使用0.
Compute concatenation var(suffix_aALL):
表示使用逗 作为分隔符,将所有匹配到的值连接为一个变量。
示例:
Default value:
默认值,即表示如果JsonPath表达式没有找到值,则将默认值赋值给变量。
注意事项:
若有收获,就点个赞吧
END
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!