如今越来越多的系统采用json格式作为数据交换格式,即服务器响应回来的文本会大量的json格式。如果我们要对服务器响应的json数据进行加工处理的话,可以使用传统的正则表达式提取器,但是在很多场合,使用json提取器进行提取会更加快速、准确。
一、JsonPath语法
1、基本操作符
(1)$ 表示根节点
示例:$ 表示获取整个json字符串(对象)
(2)@表示当前节点,一般用于子表达式或者过滤表达式
(3). 或 [ ] 用于连接父子节点
示例:$.name 表示获取根节点下的name节点的值
$.name
等价于$["name"]
$["data"]["teacher"]
等价于$.data.teacher
中括号允许一次提取多个节点,构成一个新的json子对象。
示例:$["expectage","name"]
结果为:Result[0]={"name":"testing","expectage":"25"}
(4).表示深层扫描,用于获取当前节点下的所有指定对象。
示例:$..name
表示提取根节点下(包括其子节点下)的所有叫name的子节点。
(5)*通配符
示例:$.*
表示提取根节点下的所有子节点的值。
2、数组的操作
(1)提取数组中的每个元素
$.data.student
如果student的值是一个数组,则表达式提取到的值只有一个,就是整个数组。
$.data.student[*]
或者$.data.student.*
则表示提取student数组中的每一个元素。
$.data.student[*][hobby]
表示提取student数组中的所有hobby元素的值。
(2)基于下标提取
下标从0开始计算。
示例:$.data.student[1]
表示提取student数组中的第二个元素的值。
下标可以进行多个值的枚举提取。
示例:$.data.student[1,3]
表示提取student数组中的第二个和第四个元素的值。
(3)切片提取
格式为:数组[S:E],S和E都是下标,表示获取下标从S(包括)开始到E(不包括)结束的所有数组元素的值。
示例:$.data.student[1:2]
表示提取$.data.student[1]
的值。
$.data.student[0:2]
表示提取$.data.student[0]
和$.data.student[1]
的值。
S和E可以为空。如果S为空,则表示从0开始。如果E为空,则表示到最后一个元素。
示例:$.data.student[1:]
表示从下标1开始的所有的元素。
$.data.student[:2]
等价于$.data.student[0:2]
S和E也可以是负数,表示倒数第N个元素。
示例:$.data.student[:-2]
表示获取倒数第二个元素(不包括)之前的所有元素。
$.data.student[:-1]
表示获取倒数第1个元素(不包括)之前的所有元素。
$.data.student[-2:]
表示获取倒数第二个元素(包括)之后的所有元素。
(4)过滤表达式[?(<expression>)]
可以通过过滤表达式去根据特定的条件筛选数组中符合条件的元素然后进行操作。
过滤表达式常用的操作符如下:
==、!=、<、<=、>、>=、=~正则匹配、In 存在于、Nin不存在于、Subsetof子集、||或者、&&并且
示例:$.data.student[?(@.isVIP==true)]
表示提取student数组中,isVIP属性=true的元素的值。
$.data.student[?(@.hobby.length() >= 2)]
表示提取student数组中,hobby的值的数量大于等于2个的元素的值。
$.data.student[?(@.age in ["25","26"])]
等价于$.data.student[?(@.age=="25" || @.age=="26")]
表示提取年龄在25,26这些指定的值的学生信息。
$.data.student[?(@.age nin ["25","26"])]
等价于$.data.student[?(@.age!="25" && @.age!="26")]
表示提取年龄不在25,26这些指定的值的学生信息。
$.data.student[?(@.hobby subsetof ["book","football","game"])]
表示提取兴趣包含读书、足球、游戏的学生信息
过滤表达式中也允许通过正则的方式进行过滤。
格式为:节点 =~ /正则表达式/
示例:$.data.student[?(@.name =~ /张.*/)]
表示查找姓张的学生信息。
二、Json提取器详解
Apply to:
Main sample and sub-samples:作用于主请求和子请求
Main sample only:仅作用于主请求
Sub-samples only:仅作用于子请求
JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称);用法可用于提取正则表达式提取器中的值
names of created variables:变量名称,由用户指定,用来存储jsonpath表达式所获取的值。如果有多个变量,则使用分号分隔,并且要求变量名称的个数要和表达式的个数保持一致。
Json Path expression:json path表达式。可以有多个,使用分号分隔。
Match NO:可以参考正则表达式提取器中的Match.NO。注意:使用负数保存多个值的时候,要保证json path表达式提取的也是多个值。
default value:如果只有一个json path表达式,则该处可以不填。但是如果有多个json path表达式,则该处必须填写。默认值之间使用分号分隔。