JMeter JSR223预处理器JsonSlurper无法解析含占位符JSON问题咨询
问题原因
JMeter元件执行优先级决定了:预处理器会在请求体变量替换动作之前执行,此时读取到的请求体是包含${tid}、${checksum}这类占位符的原始模板,本身不符合JSON语法,JsonSlurper自然无法解析。另外原实现还有两个隐性错误:
- 取值路径错误:
var1、var2在请求体的data节点下,直接调用json.var1拿不到对应值 - 变量拼写错误:
checksum误写为checkusm,就算解析成功也会导致变量赋值异常
同时提供的JSON请求体模板本身还有语法问题:tid字段末尾多了冗余逗号,var2的字符串值缺少闭合双引号,就算变量替换完成也会报JSON格式错误。
解决方法
优先选第一种方案,稳定性最高、维护成本最低:
- 方案1:跳过请求体解析逻辑,直接基于JMeter变量计算校验值
参与校验的三个参数里,tid已经由前置组件存入vars,var1、var2如果是固定值可以直接写在预处理器代码里,如果是动态值提前存入JMeter变量即可,完全不需要解析未完成替换的请求体,从根源上绕开JSON解析报错的问题。
修正后的预处理器代码如下:
// 读取提前生成的tid def tid = vars.get('tid') // 读取var1、var2,动态值直接用vars.get()取即可 def var1 = "value1" def var2 = "value2" // 计算校验和,注意变量名拼写 def checksum = calculateChecksum(tid, var1, var2) // 存入变量供后续请求体替换使用 vars.put('checksum', checksum)
修正语法错误后的请求体模板:
{ "event": { "checksum": "${checksum}", "tid": ${tid} }, "data": { "var1": "value1", "var2": "value2" } }
- 方案2:必须解析请求体的场景,先替换占位符再解析
如果你确实需要从请求体读取var1、var2值,就在解析前手动把当前已生成的变量替换进请求体字符串,还未生成的checksum占位符临时替换为合法JSON值(比如空字符串),把请求体处理成合法JSON格式后再调用JsonSlurper解析。
对应实现代码:
import groovy.json.JsonSlurper def jsonSlurper = new JsonSlurper() // 读取原始请求体模板 def requestBody = sampler.getArguments().getArgument(0).getValue() // 替换已生成的tid变量 requestBody = requestBody.replace('${tid}', vars.get('tid')) // 临时替换未生成的checksum占位符,避免解析报错 requestBody = requestBody.replace('"${checksum}"', '""') // 此时请求体为合法JSON,可正常解析 def reqJson = jsonSlurper.parseText(requestBody) // 注意取值路径为data下的字段 def checksum = calculateChecksum(vars.get('tid'), reqJson.data.var1, reqJson.data.var2) vars.put('checksum', checksum)
注意:该方案需要手动维护占位符替换逻辑,如果请求体里新增其他未在预处理器执行前生成的变量占位符,需要同步加替换规则,维护成本较高,仅适合请求体字段完全固定的场景。
内容的提问来源于stack exchange,提问作者Robert Strauch
相关产品推荐
相关产品推荐

