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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:06:36