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

JMeter如何按规则将CSV数据分类传入请求体的不同数组?

实现CSV数据分组为指定JSON格式的传参方法

推荐方案:使用JSR223 PreProcessor

JSR223组件支持Groovy脚本,性能优于BeanShell,适合处理这类数据分组与JSON构造需求。

步骤1:添加前置处理器

在目标HTTP请求节点上右键 → 添加 → 前置处理器 → JSR223 PreProcessor

步骤2:编写Groovy分组脚本

在PreProcessor的「Script」框中输入以下代码(替换CSV路径为你的实际文件路径):

// 初始化分组存储结构
def idGroups = [empid: [], emailid: []]

// 读取CSV文件
def csvFile = new File("你的CSV文件路径.csv")
csvFile.eachLine { line, lineNum ->
    // 跳过表头行
    if (lineNum == 1) return
    // 拆分每行数据(若CSV含转义逗号,可改用下方注释的CSV解析库)
    def parts = line.split(",")
    def id = parts[0].trim()
    def idType = parts[1].trim()
    // 按类型分组收集
    if (idGroups.containsKey(idType)) {
        idGroups[idType].add(id)
    }
}

// 生成JSON字符串
import groovy.json.JsonBuilder
def jsonBuilder = new JsonBuilder(idGroups)
def requestBody = jsonBuilder.toPrettyString()

// 将JSON存入JMeter变量
vars.put("requestBody", requestBody)

步骤3:在HTTP请求中引用变量

在HTTP请求的「Body Data」区域直接填写 ${requestBody},JMeter会自动替换为生成的目标JSON内容。

特殊场景:处理含转义逗号的CSV

如果CSV中存在带逗号的内容(如特殊格式的ID),替换脚本中的读取逻辑为:

@Grab('org.apache.commons:commons-csv:1.9.0')
import org.apache.commons.csv.CSVFormat

def idGroups = [empid: [], emailid: []]
def csvFile = new File("你的CSV文件路径.csv")
def parser = CSVFormat.DEFAULT.withHeader().parse(csvFile.newReader())

parser.each { record ->
    def id = record.get("id")
    def idType = record.get("idType")
    if (idGroups.containsKey(idType)) {
        idGroups[idType].add(id)
    }
}

// 后续JSON生成逻辑同前

可选:逐批次分组数据

若需分多次请求处理数据,可配合循环控制器实现:

  1. 添加循环控制器,设置循环次数为CSV总行数
  2. 控制器内添加CSV Data Set Config,变量名设为id,idType
  3. 新增JSR223 PreProcessor,用以下代码累计分组:
// 初始化分组结构(仅首次循环执行)
if (!vars.containsKey("idGroups")) {
    vars.putObject("idGroups", [empid: [], emailid: []])
}
def idGroups = vars.getObject("idGroups")

// 收集当前行数据
def id = vars.get("id")
def idType = vars.get("idType")
if (idGroups.containsKey(idType)) {
    idGroups[idType].add(id)
}
vars.putObject("idGroups", idGroups)

// 最后一次循环生成JSON
def totalLoops = ctx.getThreadGroup().getSamplerController().getLoopCount()
def currentLoop = ctx.getVariables().getIteration()
if (currentLoop == totalLoops) {
    import groovy.json.JsonBuilder
    def jsonBuilder = new JsonBuilder(idGroups)
    vars.put("requestBody", jsonBuilder.toPrettyString())
}

将HTTP请求放在循环控制器外,或设置为仅最后一次循环执行即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:45:35