JMeter使用JSR223后置处理器提取参数遇Json解析错误求助
JMeter JSR223后置处理器提取请求体数据报错排查与解决
问题重现
使用JSR223后置处理器提取请求体中BatchName参数时触发JSON解析错误,代码如下:
String requestBody = sampler.getArguments().getArgument(0).getValue() String BatchName = new JsonSlurper().setType(JsonParserType.LAX).parseText(requestBody).params.BatchName vars.put('BatchName', BatchName) log.info('BatchName: ' + BatchName)
执行后报错:
原因:groovy.json.JsonException:预期为'}'或',',但当前读取的字符为'o',其ASCII值为111。当前读取的字符为'o',ASCII值为111,预期为'}'或',',行号1,索引1
需求是从请求样本中提取BatchName,供后续取样器调用。
错误原因
该错误表明获取到的requestBody不是有效的JSON格式,可能的场景包括:
sampler.getArguments().getArgument(0).getValue()拿到的不是JSON请求体(比如是表单键值对、空字符串或其他非JSON内容)- 请求体本身存在JSON语法错误(比如开头不是
{、引号不匹配等) - 错误获取了请求参数而非请求体(比如HTTP请求的raw JSON体不会被包含在
arguments中)
解决方案
1. 先确认请求体实际内容
在代码开头添加日志打印,明确拿到的requestBody是什么:
String requestBody = sampler.getArguments().getArgument(0).getValue() log.info("当前获取的请求体内容: " + requestBody) // 后续解析代码...
通过JMeter日志查看输出,判断是否为预期的JSON格式。
2. 修正请求体获取方式(针对HTTP请求)
如果是发送raw JSON的HTTP请求,sampler.getArguments()通常无法正确获取请求体,改用getBodyAsString()方法更可靠:
String requestBody = ctx.getCurrentSampler().getBodyAsString()
3. 安全解析JSON并添加异常处理
添加异常捕获和空值判断,避免脚本中断,同时提升代码健壮性:
String requestBody = ctx.getCurrentSampler().getBodyAsString() log.info("请求体内容: " + requestBody) try { def json = new JsonSlurper().setType(JsonParserType.LAX).parseText(requestBody) // 用安全导航运算符避免空指针异常 String batchName = json.params?.BatchName if (batchName) { vars.put('BatchName', batchName) log.info("成功提取BatchName: ${batchName}") } else { log.warn("请求体中未找到params.BatchName字段") } } catch (Exception e) { log.error("JSON解析失败: ${e.getMessage()}", e) }
4. 非JSON请求体的处理
如果请求体是表单格式(如key1=value1&key2=value2),则不能用JsonSlurper解析,需改用参数提取方式:
// 假设BatchName是表单参数 String batchName = sampler.getArguments().getArgument("BatchName")?.getValue() if (batchName) { vars.put('BatchName', batchName) log.info("成功提取BatchName: ${batchName}") }
内容的提问来源于stack exchange,提问作者Moulika Reddy
相关产品推荐
相关产品推荐

