JSR223 PostProcessor报空指针错误 同JSON路径存在多响应如何解决
关于你的猜测是否正确的解答
你的理解是错误的。JMeter 中 prev 是 JSR223 组件的内置预定义变量,仅指向与该后置处理器绑定的前一个紧邻采样器的响应结果,不会读取所有历史响应。
如果你的 JSR223 PostProcessor 没有挂载到单个目标采样器下,而是放在了事务控制器、线程组这类父级节点下,那么它会在每一个子采样器执行完成后都运行一次,此时其他采样器的响应不存在对应JSON节点,就会触发你遇到的空指针报错。
报错提示「Cannot get property 'result' on null object」的根本原因是你硬编码了JSON路径直接访问,没有做空值兼容:只要路径中任意一级节点不存在、为null,或是数组索引越界,都会触发空指针异常。
消除报错的实现方案
Groovy 原生提供了空安全处理语法,不需要写多层嵌套判断,修改后的脚本如下:
import groovy.json.JsonSlurper // 极端兼容:采样器执行异常时prev为null,直接跳过 if (prev == null) { return } String json = prev.getResponseDataAsString() // 兼容响应为空的场景 if (json == null || json.trim().isEmpty()) { return } def root = new JsonSlurper().parseText(json) // 使用空安全操作符?.逐级访问,任意一级为空直接返回null,不会抛异常 // 数组用getAt(0)替代[0],兼容数组为空、索引越界场景 def C_accountNumber = root?.myAccount?.result?.getAt(0)?.accountNumber // 非空才存入变量,避免把null写入JMeter变量 if (C_accountNumber != null) { vars.put("C_accountNumber", C_accountNumber.toString()) } // 如果需要取值为空时存入默认值,可使用猫王运算符?:,示例如下 // vars.put("C_accountNumber", C_accountNumber?.toString() ?: "默认值")
如果你的后置处理器目前放在父级节点下,还可以优先做结构优化:把该后置处理器拖动到你需要提取accountNumber的单个目标采样器的子节点下,这样它就只会针对目标采样器运行,不会作用到其他不相关的采样器上,从触发范围层面避免报错。
内容的提问来源于stack exchange,提问作者Shabar
相关产品推荐
相关产品推荐

