JSON提取器
一、核心特性与适用场景
1.1 核心特性
- 语法简洁易上手:基于JSON Path标准语法,无需编写复杂正则,通过简单符号即可穿透层级定位数据,降低配置失误率。
- 全JSON结构适配:无缝支持单层JSON、嵌套JSON、JSON数组、带条件筛选的复杂JSON,覆盖99%接口响应场景。
- 多值提取灵活:可提取单个值、多个匹配值,还能自动生成匹配值总数与拼接变量,适配批量数据处理需求。
- 变量自动关联:提取结果直接存入自定义变量,后续元件通过
${变量名}即可直接引用,无需额外配置。 - 版本兼容性佳:JMeter 5.0+原生集成,5.1.1版本修复了层级嵌套解析异常问题,运行稳定性大幅提升。
1.2 适用场景
- 接口联动:提取登录接口返回的Token、用户ID,作为后续下单、查询、支付接口的请求头或参数。
- 数据校验:提取响应中的业务字段(如订单金额、商品库存),配合响应断言、JSON断言验证数据正确性。
- 批量请求参数化:从JSON数组中提取多个ID(商品ID、订单ID),结合循环控制器批量调用接口。
- 动态逻辑控制:根据提取的字段值(如接口状态码、业务标识),通过if控制器调整后续请求流程。
二、添加方式与执行机制
2.1 添加路径
JSON提取器为后置处理器,需挂载在目标取样器下(优先),作用域精准可控:
右键目标HTTP请求 → 添加 → 后置处理器 → JSON Extractor(JSON提取器)
注意:若将JSON提取器直接放在线程组下,将对线程组内所有取样器的响应生效,易造成变量覆盖,非必要不推荐。
2.2 执行顺序与机制
JSON提取器的执行时机决定其生效逻辑,在JMeter元件执行链中顺序如下:
配置元件 → 前置处理器 → 定时器 → 取样器(如HTTP请求) → JSON提取器(后置处理器) → 监听器
核心执行机制:取样器请求接口并获取JSON响应 → JSON提取器解析响应体 → 按JSON Path表达式定位目标字段 → 赋值给指定变量 → 供后续元件调用,全程在监听器收集结果前完成,不影响响应数据统计。
三、完整配置参数解析
JSON提取器配置面板包含6个核心参数,参数间存在强关联,需按业务场景精准配置,以下逐参数拆解(附实战逻辑):
| 参数名 | 中文释义 | 取值规则 | 实战配置逻辑 |
|---|---|---|---|
| Names of created variables | 生成的变量名 | 1. 单个变量:填写变量名(如token);2. 多个变量:用英文逗号分隔(如token,user_id,user_name)。 | 1. 变量名建议与JSON字段名一致,便于脚本维护;2. 多个变量需与JSON Path表达式顺序完全对应,一一匹配。 |
| JSON Path expressions | JSON路径表达式 | 1. 单个路径:如$.data.token;2. 多个路径:用英文逗号分隔(如$.data.token,$.data.user.id,$.data.user.name)。 | 1. 语法遵循JSON Path标准,支持层级、数组、通配符、条件筛选;2. 路径需精准匹配字段层级,避免多写漏写节点导致提取失败。 |
| Match No. (0 for Random) | 匹配序号 | 1. 0:随机提取一个匹配值;2. 正整数N:提取第N个匹配值(从1开始计数);3. -1:提取所有匹配值,生成变量列表(如var_1,var_2,var_ALL)。 | 1. 单值提取(最常用):填1,取第一个匹配值;2. 数组批量提取:填-1,获取所有元素;3. 随机取值场景:填0(如随机获取一个商品ID)。 |
| Compute concatenation var (suffix _ALL) | 拼接变量开关 | 勾选/不勾选 | 1. 仅当Match No.=-1(提取所有值)时生效;2. 勾选后生成${变量名_ALL},所有匹配值用英文逗号拼接,适合批量传递场景。 |
| Default Values | 提取失败默认值 | 1. 单个默认值:如token_extract_fail;2. 多个默认值:用英文逗号分隔(如token_null,user_null,name_null)。 | 1. 兜底值,用于路径错误、字段不存在等提取失败场景;2. 建议设置有辨识度的默认值,便于快速排查问题(如区分“提取失败”与“字段值为空”)。 |
| Apply to | 应用范围 | 1. Main sample only(仅主取样器);2. Sub-samples only(仅子取样器);3. Main sample and sub-samples(主+子取样器);4. JMeter Variable Name to use(指定变量内容)。 | 1. 99%场景选Main sample only,仅解析当前请求响应;2. 含子请求(如页面嵌入资源)场景,按需选择其他范围。 |
四、JSON Path语法核心规则
JSON提取器的核心是JSON Path语法,掌握以下规则可覆盖所有高频场景。以常见接口响应JSON为例,拆解语法用法:
基础JSON示例(后续语法演示均基于此):
{
"code": 200,
"msg": "success",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",
"user": {
"id": 1001,
"name": "test_user",
"roles": ["admin", "user"]
},
"goods_list": [
{"id": 1, "name": "手机", "price": 2999, "stock": 50},
{"id": 2, "name": "电脑", "price": 5999, "stock": 30},
{"id": 3, "name": "平板", "price": 1999, "stock": 100}
]
}
}
4.1 基础语法
| 语法符号 | 含义 | 示例表达式 | 提取结果 |
|---|---|---|---|
| $ | 根节点,所有路径的起始点 | - | - |
| . | 子节点层级分隔符(单层访问) | $.code | 200 |
| [] | 数组索引访问(从0开始计数) | $.data.user.roles[0] | admin |
| .. | 递归下降,匹配所有层级的目标字段 | $..id | 1001, 1, 2, 3 |
| * | 通配符,匹配所有同级子节点 | $.data.goods_list[*].name | 手机、电脑、平板 |
4.2 进阶语法
针对数组筛选、批量提取等复杂需求,需用到进阶语法,以下为高频用法:
| 语法场景 | 表达式示例 | 含义 | 提取结果 |
|---|---|---|---|
| 条件过滤(单条件) | $.data.goods_list[?(@.price>3000)].name | 筛选goods_list中price>3000的商品名称 | 电脑 |
| 条件过滤(多条件) | $.data.goods_list[?(@.price<3000 && @.stock>50)].id | 筛选price<3000且stock>50的商品ID | 3 |
| 数组切片 | $.data.goods_list[0:2].id | 提取数组前2个元素的ID(索引0、1) | 1, 2 |
| 取数组最后一个元素 | $.data.goods_list[-1].name | 提取goods_list数组最后一个商品名称 | 平板 |
五、高频实战场景案例
场景1:单字段提取(接口关联-获取Token)
目标:从登录接口响应中提取token,作为后续接口的Authorization请求头参数。
配置步骤:
- 给登录HTTP请求添加JSON提取器,配置如下:
- 变量名:token
- JSON Path表达式:$.data.token
- 匹配序号:1
- 默认值:token_extract_fail
- 应用范围:Main sample only
- 后续接口引用:添加HTTP信息头管理器,配置请求头
Authorization: Bearer ${token},接口将自动携带提取的token。
场景2:批量提取数组数据(批量请求参数化)
目标:从商品列表接口响应中提取所有商品ID,批量调用商品详情接口。
配置步骤:
- JSON提取器配置:
- 变量名:goods_id
- JSON Path表达式:$.data.goods_list[*].id
- 匹配序号:-1(提取所有)
- 勾选“Compute concatenation var”
- 默认值:goods_id_null
- 变量生成结果:
- 单个值引用:${goods_id_1}(1)、${goods_id_2}(2)、${goods_id_3}(3)
- 拼接值引用:${goods_id_ALL}(1,2,3)
- 批量请求:结合循环控制器+计数器,循环引用${goods_id_${计数器变量}},实现批量调用商品详情接口。
场景3:多字段同时提取(一次提取多个业务字段)
目标:一次提取token、用户ID、用户名三个字段,减少提取器数量,提升脚本效率。
配置步骤:
- JSON提取器配置:
- 变量名:token,user_id,user_name
- JSON Path表达式:$.data.token,$.data.user.id,$.data.user.name
- 匹配序号:1,1,1
- 默认值:token_null,user_id_null,user_name_null
- 变量引用:直接通过${token}、${user_id}、${user_name}引用对应字段值,分别用于后续接口参数或断言。
六、常见问题与排查方案
问题1:提取结果为默认值,未获取到目标字段
核心原因:JSON Path语法错误、字段大小写不匹配、响应结构变更、路径层级遗漏。
排查步骤:
-
打开“查看结果树”,切换到“JSON Path Tester”标签,粘贴响应JSON与表达式,验证是否能匹配到值;
-
核对字段大小写(JSON区分大小写,如Token与token为两个不同字段);
-
检查路径层级(如漏写data节点,将$.data.token写成$.token); 确认响应JSON中字段是否存在(接口返回异常时,字段可能缺失)。
问题2:变量引用显示${变量名},而非实际值
核心原因:JSON提取器添加位置错误、作用域不当、变量未生成。
排查步骤:
1. 确认JSON提取器是目标请求的直接子节点,而非线程组或其他请求下;
2. 添加“调试取样器”,运行后在查看结果树中检查变量是否被赋值;
3. 核对变量名是否拼写正确(变量名区分大小写)。
问题3:数组提取时,Match No.=-1仅生成一个变量
核心原因:JSON Path表达式仅匹配到单个值、路径未指向数组、匹配序号配置错误。
排查步骤:
1. 用JSON Path Tester验证表达式,确认是否返回数组(如$.data.goods_list[*].id应返回[1,2,3]);
2. 确认Match No.配置为-1,而非1或0;
3. 检查JSON结构,确认目标字段所在节点为数组(带[]标识)。
问题4:条件过滤表达式不生效
核心原因:JMeter 5.1.1对高级过滤语法支持有限、表达式格式错误、字段类型不匹配。
解决方案:
1. 简化表达式,优先使用基础运算符(==、>、<、&&、||),避免contains、startsWith等函数;
2. 确认字段类型(数字类型无需加引号,字符串类型需加单引号,如?(@.name=='手机'));
3. 复杂过滤场景可改用JSR223后置处理器,通过Groovy脚本解析JSON。

浙公网安备 33010602011771号