JMeter之 json提取器与json path语法
Json资源
-
JSONPath 在线练习
-
Json Path 语法说明
-
JsonPath java jar包,当你发现jmeter Json提取器满足不了你的场景时,你就可以研究这个jar包了。
Jmeter Json提取器基本使用
JSON提取器字段说明:
-
Apply to:应用范围
-
Names of created variables :接收值的变量名,自定义,多个变量用分号分隔
-
JSON Path expression: json path表达式,也是用分号分隔
-
Match No.(0 for Random):0表示随机;n取第几个匹配值;-1匹配所有。若只要获取到匹配的第一个值,则填写1
-
Compute concatenation var(suffix_ALL):如果找到许多结果,则插件将使用分号将它们连接起来,并将其存储在名为<variable name> _ALL的var中
-
Default Values: 缺省值,匹配不到值的时候取该值,可写error。
提取一个值
常规这样写就行
提取多个值
提取所有值
Json Path语法
操作示例数据
{"store": {"book": [{"category": "reference","author": "Nigel Rees","title": "Sayings of the Century","price": 8.95},{"category": "fiction","author": "Evelyn Waugh","title": "Sword of Honour","price": 12.99},{"category": "fiction","author": "Herman Melville","title": "Moby Dick","isbn": "0-553-21311-3","price": 8.99},{"category": "fiction","author": "J. R. R. Tolkien","title": "The Lord of the Rings","isbn": "0-395-19395-8","price": 22.99}],"bicycle": {"color": "red","price": 19.95}}
}
练习方式:在jmeter中新增 jp@gc - Dummy Sampler ,把示例数据放到响应中。
操作符说明
操作符 | 说明 |
---|---|
$ | 根元素 |
@ | 过滤器断言(filter predicate)处理的 当前节点对象 ,类似于this |
. or [] | 子元素 |
n/a | 父元素 |
* | 通配符,匹配所有的元素 |
. . | 递归搜索,不管位置,选择所有符合条件的条件 |
[] | 数组索引和过滤器 |
[,] | 连接操作符在XPath 结果合并其它结点集合。JSONP允许name或者数组索引。 |
[start?step] | 数组切片操作 |
?() | 应用过滤表示式,可进行过滤操作 |
() | 支持表达式计算 |
一个典型的过滤器:获取所有价格大于9的价格数,$.store.book[?(@.price> 9)].price,其中
[]
在JsonPath中有两种主要用途:
- 数组索引:
$.store.book[0],访问数组的特定位置
- 过滤器:
$.people[?(@.age > 18)],条件筛选数组元素
(这里的作用是过滤器)
?
表示开始一个过滤表达式,类似于SQL中的WHERE子句。
@
- 当前处理节点,也就是 $.store.book 这个节点
函数
函数可以在路径的尾部调用,函数的输出是路径表达式的输出,该函数的输出是由函数本身所决定的。
函数 | 描述 | 输出 | 示例 |
---|---|---|---|
min() | 提供数字数组的最小值 | Double | |
max() | 提供数字数组的最大值 | Double | |
avg() | 提供数字数组的平均值 | Double | |
stddev() | 提供数字数组的标准偏差值 | Double | |
length() | 提供数组的长度 | Integer | $..roleList.length() |
注意:函数不能在jmeter里面调试获取结果,但是可以在beanshell里面使用下图。
过滤器运算符
比较运算符
操作符 | 描述 | 示例 |
---|---|---|
== | left等于right(注意1不等于'1') | 取title等于Sayings of the Century的价格 $.store.book[?(@.title=="Sayings of the Century")].price |
!= | 不等于 | |
< | 小于 | |
<= | 小于等于 | |
> | 大于 | 获取所有价格大于9的价格数 $.store.book[?(@.price> 9)].price |
>= | 大于等于 | |
=~ | 匹配正则表达式 | 名单管理未分配列表,通过手机尾号查订单号:$.data.datas[?(@.phone =~ /.*5117/)].order_id ,正则表达式内容在两个/ /内。 |
逻辑运算符
运算符 | 描述 | 示例 |
---|---|---|
&& | 逻辑与 | $.store.book[?(@.title=="Sayings of the Century" && @.category =="reference" )].price |
|| | 逻辑或 | $.store.book[?(@.title=="Sayings of the Century" || @.category =="fiction" )].price |
! | 逻辑非 | ?(!@.active) |
存在性检查运算符
运算符 | 描述 | 示例 |
---|---|---|
in | 存在于列表中 | ?(@.author in ['Evelyn Waugh', 'Nigel Rees']) |
nin | 不存在于列表中 | ?(@.size nin ['XL', 'XXL']) |
contains | 包含某个值 | ?(@.name contains '张') |
empty | 为空检查 | ?(@.tags empty) |
正则表达式匹配
运算符 | 描述 | 示例 |
---|---|---|
=~ | 正则表达式匹配 | ?(@.email =~ '/.*@gmail\\.com/') |
JMeter中使用jsonpath的问题
在使用jmeter进行接口自动化化时,尝试过不同jar包,不同的包适用的表达式不同。
fastjson.jar (弃用)
弃用原因:不支持 $..[?(@.id=='123')].status
这种匹配的写法
github地址:https://github.com/alibaba/fastjson/wiki/JSONPath
使用教程:https://www.cnblogs.com/jajian/p/10051901.html
-
在测试时,发现在JsonPath在线练习,里能使用一次提取多个值
$.store.book[0][category,author]
这种表达式,但是jmeter的json提取器提取不了。
json-path.jar (用这个)
学习参考:
https://github.com/json-path/JsonPath
https://www.jianshu.com/p/c773d28b88b4
jmeter 本身有一个处理jsonpath的jar包,但是在beanshell直接引用时会报错,会说找不到JsonPath.read
的方法,反正百度没明白为什么会这样,直接参考beanshell 使用jsonpath解析json报错
后续,关于json-path.jar 使用遇到的问题:
【JMeter】jmeter导入json-path.jar包的解决方法_problem in beanshell script. org.apache.jorphan.ut-CSDN博客