JMeter中ForEach控制器提取值无法保留列表,如何生成JSON请求Payload?
解决JMeter循环提取值无法保留生成JSON Payload的问题
核心思路
每次循环提取的变量会被覆盖,需要将每次的值**追加到全局存储(JMeter属性)**中,循环结束后再将存储的集合转换为JSON数组作为请求体。
具体步骤
1. 循环内追加提取值到全局列表
在JSON Extractor之后添加JSR223 PostProcessor,用Groovy代码把当前循环提取的countryId、CurrencyId、countryCode追加到全局列表:
// 获取当前循环提取的字段值 def currCountryId = vars.get("countryId") def currCurrencyId = vars.get("CurrencyId") def currCountryCode = vars.get("countryCode") // 从JMeter属性中获取已存储的列表,首次执行则初始化空列表 def countries = props.get("countriesCollection") ?: [] // 将当前国家信息以Map形式加入列表 countries.add([ "countryId": currCountryId, "currencyId": currCurrencyId, "countryCode": currCountryCode ]) // 更新属性中的列表 props.put("countriesCollection", countries)
2. 循环结束后生成JSON Payload
在ForEach Loop Controller之后添加JSR223 Sampler/PreProcessor,把全局列表转换为JSON字符串并存入变量(比如finalPayload):
import groovy.json.JsonBuilder // 获取存储的国家列表 def countries = props.get("countriesCollection") ?: [] // 转换为JSON格式 def jsonBuilder = new JsonBuilder(countries) vars.put("finalPayload", jsonBuilder.toString())
3. 初始化清空全局列表(可选但建议)
在测试计划开头添加JSR223 Sampler,清空上次测试残留的全局列表:
// 清空存储的国家列表 props.remove("countriesCollection")
4. 使用生成的Payload
在需要发送JSON请求的HTTP Request中,将请求体设置为${finalPayload}即可。
替代方案(计数器+变量拼接)
如果不想用Groovy,也可以结合Counter Config元件(起始值1,递增1),每次循环把提取的值拼接到字符串变量:
- 在JSON Extractor后添加JSR223 PostProcessor,执行:
def counter = vars.get("counter") // Counter的输出变量名 def currentEntry = """{"countryId":"${vars.get('countryId')}","currencyId":"${vars.get('CurrencyId')}","countryCode":"${vars.get('countryCode')}"}""" vars.put("payloadPart_${counter}", currentEntry)
- 循环结束后,用__groovy函数拼接所有
payloadPart_变量为数组:
def parts = [] def count = Integer.parseInt(vars.get("counter")) for(int i=1; i<=count; i++) { parts.add(vars.get("payloadPart_${i}")) } vars.put("finalPayload", "[" + parts.join(",") + "]")
内容的提问来源于stack exchange,提问作者Mandy
相关产品推荐
相关产品推荐

