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
相关产品推荐
相关产品推荐

