JMeter中使用Groovy动态生成请求报文体时遇错误求助
解决JMeter中Groovy动态生成JSON请求体的问题
嘿,我看你遇到的问题主要有两个:一是原始JSON模板里有多余的逗号(这会直接导致JSON解析失败),二是需要根据CustomerType的取值动态显示对应的客户端节点。下面给你两种可行的解决方案,直接替换你现有的JSR223 Pre-Processor代码就行:
方案一:用JsonBuilder从头构建JSON(推荐)
这种方式最可靠,能彻底避免手动拼接JSON的语法错误:
import groovy.json.JsonBuilder import groovy.json.JsonOutput // 生成随机的CustomerType(也可以换成你原来的JMeter函数取值逻辑) def customerType = ["Individual", "Company"].random() // 用JsonBuilder构建完整的JSON结构 def jsonBuilder = new JsonBuilder() jsonBuilder { Transaction { TrType "Vehicle" CustomerType customerType } // 根据CustomerType动态添加对应的客户端节点 if (customerType == "Individual") { IndividualClient { firstName "test first name" lastName "test last name" } } else { CompanyClient { CompanyName "test company name" } } } // 格式化JSON并存储到JMeter变量 def requestBody = JsonOutput.prettyPrint(jsonBuilder.toString()) vars.put("requestBody", requestBody)
说明:
- 这里用Groovy自带的
random()方法生成随机的CustomerType,比依赖JMeter的__chooseRandom函数更灵活。如果你想继续用原来的JMeter函数,把第一行换成def customerType = vars.get("CustomerType")(前提是你把__chooseRandom的结果存到CustomerType变量里,比如写${__chooseRandom(Individual,Company,CustomerType)})。 JsonBuilder会自动处理JSON的语法细节,不会生成多余的逗号,完美解决你原始模板里的语法问题。- 最后把生成的JSON存到
requestBody变量,你只需要在HTTP请求的Body Data里填${requestBody}就能用了。
方案二:基于修正后的模板动态修改
如果你更习惯基于原始模板调整,先修正模板里的多余逗号,再用JsonSlurper解析修改:
import groovy.json.JsonSlurper import groovy.json.JsonOutput // 先修正原始JSON的语法错误(去掉所有多余的逗号) def jsonTemplate = ''' { "Transaction": { "TrType": "Vehicle", "CustomerType": "${__chooseRandom(Individual,Company,)}" }, "IndividualClient": { "firstName": "test first name", "lastName": "test last name" }, "CompanyClient": { "CompanyName": "test company name" } } ''' // 解析模板并替换CustomerType的随机值 def slurper = new JsonSlurper() def customerType = ["Individual", "Company"].random() def jsonObj = slurper.parseText(jsonTemplate.replace(/\$\{__chooseRandom\(Individual,Company,\)\}/, customerType)) // 移除不需要的节点 if (customerType == "Individual") { jsonObj.remove("CompanyClient") } else { jsonObj.remove("IndividualClient") } // 格式化后存储到变量 def requestBody = JsonOutput.prettyPrint(JsonOutput.toJson(jsonObj)) vars.put("requestBody", requestBody)
注意事项:
- 一定要确保JSR223 Pre-Processor的Language选项选的是
groovy,不是其他语言。 - 尽量避免在代码里直接处理JMeter函数的字符串替换,用Groovy原生语法实现逻辑更不容易出错。
内容的提问来源于stack exchange,提问作者Dipak
相关产品推荐
相关产品推荐

