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

JMeter新手求助:如何从CSV读取数据生成单请求多条目JSON体

解决方法:从CSV读取数据构造多Entry的JSON请求体

嘿,作为JMeter新手碰到这种要把多行CSV数据打包成一个JSON数组的需求很正常,我来一步步帮你实现:

1. 先整理你的CSV文件

你提供的CSV里有重复的表头,这会导致JMeter读取数据出错,先把重复的表头删掉,整理成标准格式:

tag1,tag2,tag3
75,2,000000075
73,5,000000073

2. 添加CSV Data Set Config配置

在你的线程组下添加「CSV Data Set Config」,配置如下:

  • 文件名:选择你整理好的CSV文件路径(可以用相对路径,比如./data.csv,把CSV放JMeter的bin目录下更方便)
  • 变量名:tag1,tag2,tag3(和CSV表头一一对应)
  • 分隔符:逗号(,)
  • 忽略首行:勾选「True」(跳过表头行)
  • 循环控制:选择「All rows」,并且把「Recycle on EOF」设为「False」,「Stop thread on EOF」设为「False」(这样我们可以用循环把所有行数据收集起来)

3. 添加循环控制器收集所有数据

我们需要先把CSV里的所有行数据收集成一个List,后续用来构造JSON数组:

  • 在线程组下添加「循环控制器」,设置循环次数为CSV的数据总行数(比如你的CSV有2条数据就设为2;如果行数不确定,可以用JMeter函数${__intSum(${__CSVRead(./data.csv,0)},-1,)}自动计算,这个函数会先获取CSV总行数,再减去表头行得到数据行数)
  • 在循环控制器下添加「JSR223 PostProcessor」,用Groovy脚本(性能比BeanShell好很多)把每行数据存入全局List:
    // 初始化全局List,只在第一次循环时创建
    if (!vars.getObject("entriesList")) {
        def entries = new ArrayList<>()
        vars.putObject("entriesList", entries)
    }
    
    // 构造当前行的entry对象,注意tag3保留原字符串格式
    def entry = [
        tag1: [id: vars.get("tag1") as Integer],
        tag2: vars.get("tag2") as Integer,
        tag3: [id: vars.get("tag3")]
    ]
    
    // 添加到List中
    vars.getObject("entriesList").add(entry)
    

4. 构造最终的JSON请求体

现在我们已经把所有CSV数据收集到entriesList里了,接下来在HTTP请求的「Body Data」里构造JSON:
输入以下内容,用Groovy函数把List转换成标准JSON数组:

{
    "entries": ${__groovy(vars.getObject("entriesList").toString().replaceAll(/=\[/, ':[').replaceAll(/, /, ','),)}
}

解释:Groovy的List默认toString格式是[tag1:[id:75],tag2:2,...],我们通过替换=为:、, 为,,把它转换成符合JSON规范的数组格式。

如果想更稳妥地生成标准JSON,可以换用JsonBuilder来构造:
把JSR223 PostProcessor的脚本改成:

import groovy.json.JsonBuilder

if (!vars.getObject("entriesList")) {
    def entries = new ArrayList<>()
    vars.putObject("entriesList", entries)
}

def entryBuilder = new JsonBuilder()
entryBuilder {
    tag1 id: vars.get("tag1") as Integer
    tag2 vars.get("tag2") as Integer
    tag3 id: vars.get("tag3")
}

vars.getObject("entriesList").add(entryBuilder.toString())

然后HTTP请求的Body Data改成:

{
    "entries": [${__groovy(vars.getObject("entriesList").join(','),)}]
}

这种方式生成的JSON格式更严谨,不容易出格式问题。

5. 验证结果

添加「查看结果树」组件,发送请求后检查请求Body,最终生成的内容应该和你预期的格式一致:

{
    "entries": [{"tag1":{"id":75},"tag2":2,"tag3":{"id":"000000075"}},{"tag1":{"id":73},"tag2":5,"tag3":{"id":"000000073"}}]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:36:18