后置处理器之JSON提取器

By:授客 QQ:1033553122

测试环境

JMeter 5.4.1

插件介绍

JSON后置处理器(PostProcessor)允许使用 JSON Path 语法从JSON格式的响应中提取数据。类似正则表达式提取器,必须位于HTTP采样器、或者其它可以返回JSON数据的采样器下,作为子结点。

插件参数

Name

显示在脚本树结构中的名称

Apply to:

这用于可以生成子采样器的采样器,比如携带嵌套资源的HTTP采样器、邮件读取器或者由事务控制器控制的采样。

  • Main sample only

    仅适用于主采样

  • Sub-samples only

    仅适用于子采样

  • Main sample and sub-samples

    适用于主采样和子采样

  • JMeter Variable Name to use

    提取适用于命名变量的内容。

Names of created variables

由英文分号 ;分隔的变量名称,这些变量分别用于存储对应JSON-PATH表达提取的结果(必须匹配JSON-PATH表达式数量)。

JSON Path Expressions

由分号分号 ;分割的JSON-PATH表达式 (必须匹配变量的数量)

Default Values

如果对应变量的JSON-PATH表达式不返回任何结果时,对应变量的默认值,由英文分号 ;分隔(必须匹配变量的数量)

Match Numbers

对于每个JSON-PATH表达式,如果表达式查询到多个结果时,你可以选择提取那个值作为变量值。

  • 0 表示随机(匹配数字的默认值)
  • -1 提取所有结果,这些结果将存储到名为<variable name>_N的变量(N取值从1到提取结果的数量)
  • X 表示提取第X个结果。如果第X个结果不存在,则不会返回任何值,直接使用对应默认值作为变量。

这些匹配数字必须使用英文分号相隔,且匹配JSON-PATH表达式的数量。如果不配置匹配数字,默认使用0作为每个表达式的默认值。

注意:不管对应的JSON-PATH表达式能否查询到结果,程序都会将结果数(如果查询不到结果则设置为 0 )存储到变量 <variable name>_matchNr

Compute concatenation var

如果勾选,则表示如果对应表达式查询到多个结果,插件将使用 , 连接这些值并存储为命名为<variable name>_ALL的变量中。

插件使用示例

其中登录请求返回类似如下信息

{"token":"73ab6c33c39a46c1b27ae314b7a7eb1e","userName":"测试","warehouseList":[{"warehouseCode":"001DSC","warehouseName":"测试仓库","areas":[{"zonegroupCode":"A1","zonegroupdescr":"A1区"},{"zonegroupCode":"A2","zonegroupdescr":"A2区"},{"zonegroupCode":"A3","zonegroupdescr":"A3区"},{"zonegroupCode":"A4","zonegroupdescr":"A4区"}]}],errorMsgPrams":["SUCCESS"]}

通过Debug PostProcessor观察到提取的相关变量值如下

JMeterVariables:
areas=[{"zonegroupCode":"A1","zonegroupdescr":"A1区"},{"zonegroupCode":"A2","zonegroupdescr":"A2区"},{"zonegroupCode":"A3","zonegroupdescr":"A3区"},{"zonegroupCode":"A4","zonegroupdescr":"A4区"}]
areas_matchNr=1
token=d50350c345824a95ba8e1e4d43270fff
token_matchNr=1
zonegroupCode_1=A1
zonegroupCode_2=A2
zonegroupCode_3=A3
zonegroupCode_4=A4
zonegroupCode_5=A5
zonegroupCode_matchNr=5

JSON-PATH表达式介绍

JsonPath表达式可以使用点标记

$.store.book[0].title

或者括号标记

$['store']['book'][0]['title']

操作符

操作符 描述
$ 需要查找的根元素。所有JSON PATH表达式都以这个开头
@ 正被某个过滤谓词处理的当前节点(The current node being processed by a filter predicate)
* 通配符。可以表示一个名称或者数字
.. 深度扫描。可以表示一个名称
.<name> 获取子节点。
['<name>' (, '<name>')] 括号标记的子结点或者子孙结点
[<number> (, <number>)] 单个或多个数组索引。
[start:end] 数组切片操作符。注意,不含end
[?(<expression>)] 过滤表达式,必须为boolean表达式

函数

可以在path表达式末尾调用函数--表达式输出即为函数的输入。常见函数如下

函数 描述 输出类型
min() 获取数字数组的最小值。 Double
max() 获取数字数组的最大值。 Double
avg() 获取数字数组的平均值。 Double
stddev() 获取数字数组的标准方差。 Double
length() 获取数组长度 Integer
sum() 获取数字数组的总和。 Double
append(X) 添加一个元素到JSON-PATH表达式输出数组中 同输入

过滤器操作符

过滤器为用于过滤数组的逻辑表达式,一个典型的过滤器 [?(@.age > 18)] ,这里 @代表正被处理的当前项。可以使用逻辑操作符 &&||创建更复杂的过滤器。字符串文字必须用单引号或者双引号引起来,形如 ([?(@.color == 'blue')] 或者 [?(@.color == "blue")])

操作符 描述
== 等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
=~ 匹配正则表达式,形如[?(@.name =~ /foo.*?/i)]
in 包含于,形如 [?(@.size in ['S', 'M'])]
nin 不包含于
subsetof 子集,形如 [?(@.sizes subsetof ['S', 'M', 'L'])]
anyof 操作符左侧值必须和右侧有交集(left has an intersection with right),形如[?(@.sizes anyof ['M', 'L'])]
noneof 操作符左侧值和右侧无交集
size 操作符左侧数组或者字符串长度必须匹配右侧
empty 操作符左侧必须为空数组或者字符串

JSON PATH示例

给定如下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] The first two books
$..book[:2] 索引为0到2(不含2)的所有书籍
$..book[1:2] 索引为1到2(不含2)的所有书籍
$..book[-2:] 最后两本书
$..book[2:] 索引为2及其往后的所有书籍。
$..book[?(@.isbn)] 携带isbn号的所有书籍 an ISBN number
$.store.book[?(@.price < 10)] 商店中价格低于10的所有书籍。
$..book[?(@.price <= $['expensive'])] 所有非 "expensive"的书籍
$..book[?(@.author =~ /.*REES/i)] 所有匹配正则表达式(忽略大小写)的书籍
$..* 返回所有东西
$..book.length() 书籍数量

参考连接

https://github.com/json-path/JsonPath

https://jmeter.apache.org/usermanual/component_reference.html#JSON_Extractor

JMeter 后置处理器之JSON提取器的更多相关文章

  1. jmeter后置处理器之Json提取器详解

    此提取器用于提取请求返回结果中的某个值或者某一组值,用法比正则表达式要简单,标准写法为$.key,其中key为返回结果map中的一个键,如果是多层则继续用.key进行即可,如果遇到key的value值 ...

  2. JMeter 后置处理器之正则表达式提取器详解

    后置处理器之正则表达式提取器详解   by:授客 QQ:1033553122 1. 添加正则表达式提取器 右键线程组->添加->后置处理器->正则表达式提取器 2. 提取器配置介绍 ...

  3. Jmeter后置处理器,正则表达式提取器的使用

    [使用场景]:下一个请求参数需要从上一个请求的响应数据中获取 [jmeter正则表达式说明]:使用perl正则表达式(可参考:http://www.runoob.com/perl/perl-regul ...

  4. Jmeter后置处理器之JSON Extractor

    一.使用场景 json extractor后置处理器用在返回格式为json的HTTP请求中,用来获取返回的json中的某个值.并保存成变量供后面的请求进行调用或断言等. 二.使用方法 步骤一:选择HT ...

  5. jmeter里面Dug Sampler 和json提取器的用法

    1.编写用户详情请求 2.查看结果树 一级一级往上查找父集 3.添加json提取器 步骤:点击[用户详情]请求->添加->后置处理器->json提取器 把查看结果树里面的JSON P ...

  6. 【Vlog】Jmeter之使用beanshell将json提取器中的多个值拼接为一个列表

    场景如下: json提取器返回了当前登录用户的所有好友id,然而下一个接口是把好友id拼成一个数组进行传参的,现需将所有的好友ID拼接起来,类似ID1,ID2,ID3......这样 beanshel ...

  7. jmeter数据关联_后置处理器_正则表达式提取器

  8. jmeter后置处理器之正则表达式

    一.基本用法——提取某个值 场景:提取某个值,保存成变量,供后面的接口使用 步骤: 1.运行脚本,从响应结果中查找要提取的值,找到左右边界. 例如要获取“patientInfoId”作为下一个请求的参 ...

  9. jmeter后置处理器之正則表達式提取器

    新浪围脖>@o蜗牛快跑o    使用这个组件时,注意使用带分组的正則表達式 使用正则分组方便提取干净数据.以免再次处理数据字符串 正則表達式在线工具推荐:点击打开链接 正則表達式语法參考:点击打 ...

  10. jmeter接口之json提取器应用

    在接口测试中有一个这样的场景:业务接口需要用到登录token:下个接口需要用到前个接口返回值作为参数,该怎么实现? 首先先看下登录.业务接口,本文用的jmeter版本为5.4.1 一.json提取器设 ...

随机推荐

  1. Vue cli之项目打包

    在项目根目录中执行如下命令: npm run build 注:Vue脚手架打包的项目必须在服务器上运行,不能直接双击运行: 在打包之后项目中出现 dist 目录,dist 目录就是 Vue脚手架项目的 ...

  2. .net core 转 excel datatable list<t> 互转 xlsx

    using System; using System.Collections; using System.Collections.Generic; using System.ComponentMode ...

  3. SpringBoot自定义拦截器(多个拦截器)

    在 Spring Boot 中要实现自定义拦截器需要实现 HandlerInterceptor 接口,并重写 preHandle.postHandle 和 afterCompletion 方法: im ...

  4. 使用vscode编辑c语言

    在 Visual Studio Code (VSCode) 中配置 C 语言环境 步骤指南: 一,前期准备(安装扩展,软件包) 安装 C/C++ 扩展 打开 VSCode. 点击左侧边栏的扩展按钮(或 ...

  5. npm包管理器 切换npm源 使用nrm来管理npm镜像源

    npm是NodeJs项目模块管理工具,它已经集成了nodejs安装包中,在npm从从5.2版开始,增加了 npx 命令(解决的主要问题,就是调用项目内部安装的模块,很多工具不再需要npm -g 全局来 ...

  6. C#.NET 操作FTP

    工具类: using System; using System.Collections.Generic; using System.IO; using System.Net; namespace Co ...

  7. 2 分钟,搞懂 SLO 最佳实践

    本文是<SRE,Google运维解密>读书笔记,连载第三篇.微信公众号修改了推文逻辑,尤其是 iOS,建议对本公众号 SRETalk 加星标,以免错过后续系列推文. 本文介绍 SLO,曾经 ...

  8. 一个常见的 JavaScript 解构陷阱

    在日常的 JavaScript 编码中,我们经常使用解构语法来提取对象中的属性.假设我们有一个名为 fetchResult 的对象,代表从接口返回的数据,其中包含一个字段名为 data. const ...

  9. CS后门源码特征分析与IDS入侵检测

    CS后门源码特征分析与IDS入侵检测考核作业 上线x64 getshell 抓心跳包,对特征字符解密Uqd3 用java的checksum8算法得到93,说明是x64的木马 public class ...

  10. 一文详解分布式 ID

    前言 分布式系统中,我们经常需要对数据.消息等进行唯一标识,这个唯一标识就是分布式 ID,那么我们如何设计它呢?本文将详细讲述分布式 ID 及其生成方案. 一.为什么需要分布式 ID 目前大部分的系统 ...