完整教程:JMeter之 json提取器与json path语法
Json资源
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博客
浙公网安备 33010602011771号