You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jmeter:如何将JSON提取器提取的动态JSON全量ID输出至日志

场景说明
  • 存在结构固定、数据量动态增长的JSON接口响应,结构如下:
{
    "payload": {
        "totalCount": 302,
        "items": [
            {
                "id": 1379,
                "date": "2021-04-08T17:06:03+02:00",
                "name": "Newcastle United Aston Villa",
                "externalId": "2",
                "mediaTag": null,
                "deleted": false,
                "originalId": null,
                "cancelled": false,
                "relatedEventsOrderIndex": []
            },
            {
                "id": 1380,
                "date": "2021-04-08T17:06:03+02:00",
                "name": "Arsenal Tottenham Hotspur",
                "externalId": "3",
                "mediaTag": null,
                "deleted": false,
                "originalId": null,
                "cancelled": false,
                "relatedEventsOrderIndex": []
            }
        ]
    },
    "errorCode": 0,
    "errorTimeStamp": null,
    "errorMessage": null,
    "hasError": false
}
  • 已配置JSON提取器完成目标字段提取,生成的变量遵循ID1_1、ID1_2…ID1_100的动态命名规则,提取功能本身运行正常
  • 需实现批量输出所有提取到的ID到日志的功能,编写的初始Groovy脚本触发报错:
def IDS = vars.getObject("ID1");

for (int i=0; i>IDS.length; i++) {
    
    log.warn("ID as: " + IDS + (i + 1) );
}  
  • 运行时报错信息:Cannot get property 'length' on null object
问题原因
  • 空值来源:JMeter JSON提取器不会自动生成名为ID1的数组类型对象,只会生成带编号后缀的独立字符串变量,因此vars.getObject("ID1")返回null,调用null的.length属性直接触发空指针异常
  • 逻辑错误:原循环判断条件i > IDS.length与常规遍历逻辑完全反向,即使能拿到有效数组,初始条件也不成立,无法进入循环体
  • 拼接错误:循环内日志直接拼接数组对象与循环序号,未取对应下标的具体ID值,即使循环能正常运行,输出的内容也不符合预期
正确实现方案

方案1:适配现有提取器配置遍历变量

这是改动最小的实现方式,核心利用JMeter JSON提取器自动生成的匹配计数变量,完全适配数据动态增长的场景,脚本如下:

// 获取自动生成的匹配总数量,变量格式固定为「提取器引用名_matchNr」
def matchTotal = vars.get("ID1_matchNr") as int

// 从1开始遍历所有匹配项(JMeter生成的变量编号从1开始)
(1..matchTotal).each { currentIndex ->
    def currentId = vars.get("ID1_" + currentIndex)
    log.warn("提取到的ID值: ${currentId}")
}

关键说明:JMeter任意后置提取器组件在完成多值匹配后,都会自动生成后缀为_matchNr的变量存储匹配总数,不需要手动计算数组长度,可完全适配JSON数据量动态变化的场景,不会出现漏取、空值问题。

方案2:脚本直连响应数据解析

如果不需要将提取的ID传递给后续采样器,可跳过JSON提取器组件,直接在Groovy脚本中解析接口响应,减少组件配置量,脚本如下:

// 获取当前采样器的原始响应字符串
def responseContent = prev.getResponseDataAsString()
// 初始化JSON解析工具
def jsonParser = new groovy.json.JsonSlurper()
def parsedResponse = jsonParser.parseText(responseContent)

// 遍历items列表提取所有id并打日志
parsedResponse.payload.items.eachWithIndex { item, index ->
    log.warn("第${index + 1}条记录的ID值: ${item.id}")
}

内容的提问来源于stack exchange,提问作者vlatko606

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 10:54:04