完整教程:JMeter之 json提取器与json path语法

Json资源

配套练习:

测试人专属练手项目上线了

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博客

posted on 2025-11-08 11:08  slgkaifa  阅读(5)  评论(0)    收藏  举报

导航