JsonPath 表达式总是以与 XPath 表达式与 XML 文档结合使用的相同方式引用 JSON 结构。JsonPath 中的“根成员对象”总是被引用,$
无论它是对象还是数组。
JsonPath 表达式可以使用点符号
$.store.book[0].title
或括号符号
$['store']['book'][0]['title']
Operator | 描述 |
---|---|
$ | 要查询的根元素。这将启动所有路径表达式。 |
@ | 过滤谓词正在处理的当前节点。 |
* | 通配符。可在任何需要名称或数字的地方使用。 |
… | 深层扫描。可在任何需要名称的地方使用。 |
. |
带点符号的孩子 |
[’ |
括号标记的孩子或孩子 |
[ |
数组索引或索引 |
[start:end] | 数组切片运算符 |
[?( |
过滤表达式。表达式必须计算为布尔值。 |
Function | 描述 | 输出类型 |
---|---|---|
min() | 提供数字数组的最小值 | Double |
max() | 提供数字数组的最大值 | Double |
avg() | 提供一组数字的平均值 | Double |
stddev() | 提供数字数组的标准偏差值 | Double |
length() | 提供数组的长度 | Integer |
sum() | 提供数字数组的总和值 | Double |
keys() | 提供属性键(终端波浪号的替代方案~ ) |
Set |
concat(X) | 提供带有新项目的路径输出的连接版本 | like input |
append(X) | 向 json 路径输出数组添加一个项目 | like input |
[?(@.age > 18)]
其中@
代表正在处理的当前项目。可以使用逻辑运算符&&
和来创建更复杂的过滤器||
。字符串文字必须用单引号或双引号 ([?(@.color == 'blue')]
或[?(@.color == "blue")]
)括起来。操作符 | 描述 |
---|---|
== | 左等于右(注意1不等于’1’) |
!= | 左不等于右 |
< | 左边小于右边 |
<= | 左小于或等于右 |
> | 左大于右 |
>= | 左大于或等于右 |
=~ | left 匹配正则表达式 [?(@.name =~ /foo.*?/i)] |
in | 左边存在于右边 [?(@.size in [‘S’, ‘M’])] |
nin | 左边不存在于右边 |
subsetof | left 是 right [?(@.sizes subnetof [‘S’, ‘M’, ‘L’])] 的子集 |
anyof | 左边与右边有交集 [?(@.sizes anyof [‘M’, ‘L’])] |
noneof | 左边与右边没有交集 [?(@.sizes noneof [‘M’, ‘L’])] |
size | 左侧(数组或字符串)的大小应与右侧匹配 |
empty | 左(数组或字符串)应为空 |
{
"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
}
},
"expensive": 10
}
JsonPath | 结果 |
---|---|
$.store.book[*].author] | 所有书籍的作者 |
$…author | 所有作者 |
$.store.* | 所有的东西,包括书籍和自行车 |
$.store…price | 所有的价格 |
$…book[2] | 第三本书 |
$…book[-2] | 倒数第二本书 |
$…book[0,1] | 前两本书 |
$…book[:2] | 从索引 0(包含)到索引 2(不包含)的所有书籍 |
$…book[1:2] | 从索引 1(包括)到索引 2(不包括)的所有书籍 |
$…book[-2:] | 最后两本书 |
$…book[2:] | 从索引 2(包括)到最后的所有书籍 |
$…book[?(@.isbn)] | 所有有isbn 属性的书 |
$.store.book[?(@.price < 10)] | price小于10的所有书 |
$…book[?(@.price <= $[‘expensive’])] | price的值小于等于expensive的值(10)的所有书 |
$…book[?(@.author =~ /.*REES/i)] | 所有匹配正则表达式的书籍(忽略大小写) |
$…*] | 所有的 |
$…book.length() | 图书属性(数组)值的长度 |
完整的语法说明请见https://github.com/json-path/JsonPath
参数 | 说明 | 是否必填 |
---|---|---|
Names of created variables | 保存的变量名称,多个变量用分号分隔 | 是 |
JSON Path Expressions | json path表达式,多个时也是用分号分隔 | 是 |
Match No. (0 for Random) | 0表示随机;-1匹配所有;n取第几个匹配值;。 若只要获取到匹配的第一个值,则填写1; 必须匹配变量数 ,如果此 n大于匹配数,则不返回任何内容。将使用默认值 |
否 |
Compute concatenation var | 如果找到许多结果,则插件将使用’ , '分隔符将它们连接起来,并将其存储在名为 _ALL的var中 | 否 |
Default Values | 缺省值,匹配不到值的时候取该值;多个值时用分号分隔,必须匹配变量数 | 否 |
示例:提取登录后返回的ticket认证信息
添加后置处理器→json提取器
这里ticket的值只有一个,Match No. (0 for Random) 填不填写都可以
下个接口引用变量:
将获取到的每一个一级菜单id循环进行获取子菜单的信息
1)添加循环控制器,设置循环次数。
2)在请求中添加json提取器每次提取到的id
因为要把JSON提取器中匹配到的muenid_1,…muenid_35循环传递给查询菜单,
__counter为jmeter自带的一个计数函数,KaTeX parse error: Expected group after '_' at position 2: {_̲_counter(,)}引用这…{__counter(,)}运行第1次muenid_1,运行第2次muenid_2,以此类推,直到运行到循环次数muenid_22
_V为jmeter自带的一个嵌套变量函数,运行第1次muenid${__counter(,)}为muenid_1,${_V(muenid${__counter(,)},)}则为${muenid_1};以此类推,一直循环到${muenid_22}
3) 运行结果:
Match No填写-1,获取所有时
在引用时,需使用${参数名_n}否则直接使用${参数名}会无法引用,匹配结果确定是唯一匹配时不建议使用-1,建议不填写或1
示例:
结果变量引用失败
正确写法:
可以正常获取值
建议:
匹配结果为多个值时Match No填写-1,否则匹配结果唯一值时,建议不填写或1.
JsonPath结合正则表达式
{
"list":[
{
"id":1803168517610080,
"code":"jd1",
"shortName":"jd1",
"fullName":"jd1",
"users":[
{
"userName":"jd1",
"userType":1,
"threeRoleType":null
}
],
"fullPath":"/默认公司/jd1",
"layNo":1,
"sort":0,
"parentId":1000,
"description":null,
"tags":[
],
"layRec":"1000-1803168517610080",
"valid":true
},
{
"id":1445827415104496,
"code":"ceshi",
"shortName":"测试公司",
"fullName":"测试公司",
"users":[
{
"userName":"ceshi",
"userType":1,
"threeRoleType":null
}
],
"fullPath":"/默认公司/测试公司",
"layNo":1,
"sort":0,
"parentId":1000,
"description":null,
"tags":[
],
"layRec":"1000-1445827415104496",
"valid":true
}
]
}
获取code以jd开头的id
$.list[?(@.code =~/^Jd.*$/i)].id //不区分大小写
$.list[?(@.code =~/^jd.*$/)].id //区分大小写