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请求头参数。

配置步骤:

  1. 给登录HTTP请求添加JSON提取器,配置如下:
    1. 变量名:token
    2. JSON Path表达式:$.data.token
    3. 匹配序号:1
    4. 默认值:token_extract_fail
    5. 应用范围:Main sample only
  2. 后续接口引用:添加HTTP信息头管理器,配置请求头 Authorization: Bearer ${token},接口将自动携带提取的token。

场景2:批量提取数组数据(批量请求参数化)

目标:从商品列表接口响应中提取所有商品ID,批量调用商品详情接口。

配置步骤:

  1. JSON提取器配置:
    1. 变量名:goods_id
    2. JSON Path表达式:$.data.goods_list[*].id
    3. 匹配序号:-1(提取所有)
    4. 勾选“Compute concatenation var”
    5. 默认值:goods_id_null
  2. 变量生成结果:
    1. 单个值引用:${goods_id_1}(1)、${goods_id_2}(2)、${goods_id_3}(3)
    2. 拼接值引用:${goods_id_ALL}(1,2,3)
  3. 批量请求:结合循环控制器+计数器,循环引用${goods_id_${计数器变量}},实现批量调用商品详情接口。

场景3:多字段同时提取(一次提取多个业务字段)

目标:一次提取token、用户ID、用户名三个字段,减少提取器数量,提升脚本效率。

配置步骤:

  1. JSON提取器配置:
    1. 变量名:token,user_id,user_name
    2. JSON Path表达式:$.data.token,$.data.user.id,$.data.user.name
    3. 匹配序号:1,1,1
    4. 默认值:token_null,user_id_null,user_name_null
  2. 变量引用:直接通过${token}、${user_id}、${user_name}引用对应字段值,分别用于后续接口参数或断言。

六、常见问题与排查方案

问题1:提取结果为默认值,未获取到目标字段

核心原因:JSON Path语法错误、字段大小写不匹配、响应结构变更、路径层级遗漏。

排查步骤:

  1. 打开“查看结果树”,切换到“JSON Path Tester”标签,粘贴响应JSON与表达式,验证是否能匹配到值;

  2. 核对字段大小写(JSON区分大小写,如Token与token为两个不同字段);

  3. 检查路径层级(如漏写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。    
posted @ 2026-01-23 13:29  向闲而过  阅读(0)  评论(0)    收藏  举报