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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:18:53