Jmeter JSON提取器
此提取器用于提取请求返回结果中的某个值或者某一组值,标准写法为$.key,其中key为返回结果map中的一个键,如果是多层则继续用.key进行即可,如果遇到key的value值为一个List,则使用.key[n],其中n为list中元素的编号,如下使用实例来说明下如何使用;
Json提取器语法说明
完整的语法说明详见JsonPath:
如有以下Json返回
{ "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:] | 从尾部到第二本书 |
$..book[?(@.isbn)] | 所有带有ISBN编号的书籍 |
$.store.book[?(@.price < 10)] | 店里所有标价低于10的书 |
$..book[?(@.price <= $['expensive'])] | 店内所有价格低于“expensive”的书 |
$..book[?(@.author =~ /.*REES/i)] | 与正则匹配的所有书籍(忽略大小写) |
$..* | 返回Store的所有内容 |
$..book.length() | 书的数量 |
调试方法:
在查看结果树(View Result Tree)中选择JSON Path Tester,即可展开如下图的右侧内容,输入表达式即可拿来测试书写的Json提取器表达式是否能正常工作:
从上图的输出可见返回的数组下标从0开始。
添加JSON提取器,获取所有author
添加调试取样器调试用,可看到获取到了所有作者的值。通过author_1,....author_22可得到每一个author。
将获取到每一个用户author循环进行“http请求”查看结果。
添加循环控制器,设置循环次数:author_matchNr从上面的JSON取样器中匹配到,这里进行变量引用
在循环控制器之下添加http请求,并做以下设置。
__counter为jmeter自带的一个计数函数,${__counter(,)}引用这个函数,每运行1次+1,从1开始;
author_${__counter(,)}运行第1次author_1,运行第2次author_2,以此类推,直到运行到循环次数author_4
__V为jmeter自带的一个嵌套变量函数,运行第1次author_${__counter(,)}为author_1,${__V(author_${__counter(,)},)}则为${author_1},值Nigel Rees;以此类推,一直循环到${author_4}