JMeter Beanshell后置处理器JSON类型赋值错误求助
问题场景
在JMeter的Beanshell后置处理器中处理HTTP请求返回的JSON数组时出现错误,JMeter通过mvn jmeter:configure jmeter:gui命令启动,Maven插件配置如下:
<plugin> <groupId>com.lazerycode.jmeter</groupId> <artifactId>jmeter-maven-plugin</artifactId> <version>3.5.0</version> <executions> .... </executions> <configuration> <generateReports>true</generateReports> <testFilesIncluded> .... </testFilesIncluded> <jmeterVersion>5.4.3</jmeterVersion> <ignoreResultFailures>true</ignoreResultFailures> <testPlanLibraries> <artifact>com.googlecode.json-simple:json-simple:1.1.1</artifact> <artifact>com.fasterxml.jackson.core:jackson-databind:2.14.1</artifact> <artifact>com.github.javafaker:javafaker:1.0.2</artifact> </testPlanLibraries> <jmeterExtensions> <artifact>kg.apc:jmeter-plugins-manager:1.6</artifact> <artifact>kg.apc:jmeter-plugins-standard:1.4.0</artifact> <artifact>kg.apc:jmeter-plugins-common:1.4.0</artifact> <artifact>kg.apc:jmeter-plugins-extras:1.4.0</artifact> <artifact>kg.apc:jmeter-plugins-extras-libs:1.4.0</artifact> <artifact>com.blazemeter:jmeter-parallel:0.11</artifact> </jmeterExtensions> ..... </configuration> </plugin>
使用的Beanshell脚本:
import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; JSONParser jsonParser = new JSONParser(); JSONObject jsonObject; JSONObject jsonArray; try { jsonObject = (JSONObject)jsonParser.parse(prev.getResponseDataAsString()); jsonArray = (JSONArray)jsonObject.get("value"); // List<JSONObject> jsonList = new ArrayList(); // if (jsonArray != null) { // for (Object object : jsonArray) { // JSONObject jsonObj = (JSONObject)object; // jsonList.add(jsonObj); // } // } } catch (Exception e) { e.printStackTrace(); } log.info("jsonArray: " + jsonArray);
执行时出现的错误(已翻译为中文):
调用bsh方法出错:eval 源文件:内联执行代码:
import org.json.simple.JSONArray; import org.json.simple.JSONObject; import o . . . '' : 变量赋值错误: jsonArray: 无法将org.json.simple.JSONArray类型赋值给org.json.simple.JSONObject类型 BeanShell脚本问题: org.apache.jorphan.util.JMeterException: 调用bsh方法出错: eval 源文件:内联执行代码:import org.json.simple.JSONArray; import org.json.simple.JSONObject; import o . . . '' : 变量赋值错误: jsonArray: 无法将org.json.simple.JSONArray类型赋值给org.json.simple.JSONObject类型
报错具体行:jsonArray = (JSONArray)jsonObject.get("value");
错误原因
变量类型声明错误:脚本中将jsonArray变量声明为JSONObject类型,但实际从jsonObject.get("value")获取的是JSONArray对象,尝试将JSONArray赋值给JSONObject类型变量,导致类型不匹配错误。
解决方法
修改变量声明,将JSONObject jsonArray;改为JSONArray jsonArray;,修正后的完整脚本如下:
import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; JSONParser jsonParser = new JSONParser(); JSONObject jsonObject; JSONArray jsonArray; // 修正类型声明 try { jsonObject = (JSONObject)jsonParser.parse(prev.getResponseDataAsString()); jsonArray = (JSONArray)jsonObject.get("value"); // List<JSONObject> jsonList = new ArrayList(); // if (jsonArray != null) { // for (Object object : jsonArray) { // JSONObject jsonObj = (JSONObject)object; // jsonList.add(jsonObj); // } // } } catch (Exception e) { e.printStackTrace(); } log.info("jsonArray: " + jsonArray);
额外提示:JMeter 5.4.3版本中,推荐使用JSR223后置处理器替代Beanshell,JSR223支持Groovy等脚本语言,性能更高且语法更简洁,处理JSON时可直接使用Groovy的内置JSON解析能力,无需额外导入json-simple依赖。
内容的提问来源于stack exchange,提问作者djangofan

