我的最终目标是从列表中获取一个字符串,该列表是从JSON响应动态创建的。我在从外部BeanShell脚本中创建的列表中调用值时遇到了麻烦。外部脚本读取JSON响应并从过滤的响应中创建列表。
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.Filter;
try{
String json = new String(prev.getResponseDataAsString());
List allPositiveAffects = JsonPath.read(json, "$.affectTags[?(@.value > 0.0)].key", new Filter[]{});
vars.putObject("allPositiveAffects",allPositiveAffects);
log.info("allPositiveAffects: " + allPositiveAffects);
int positiveAffectCount = allPositiveAffects.size();
vars.put("positiveAffectCount",Integer.toString(positiveAffectCount));
} catch (Throwable ex){
log.error("Error:\n", ex);
}
allPositiveAffects
返回预期值,所以现在我想将其中一个值放入后续的JSON POST中。
我的Jmeter测试设置:
- Thread Group
+ JSON GET request
- BeanShell PostProcessor
+ JSON POST request
尝试从allPositiveAffects
获取值已经证明不像在我的BeanShell脚本中调用allPositiveAffects.get(n)
那么容易。
我还没有想出一个简单的方法来获取列表的内容。我错过了什么吗?我在JSON POST request
中尝试了几种不同的东西。最新的是:
//json POST data
{
"entries":[
"id": -1,
"key": "${__BeanShell(${allPositiveAffects}.get(1))}"]
}
返回以下错误:
java.lang.ClassCastException: net.minidev.json.JSONArray cannot be cast to java.lang.String
对此解决方案或解决方法的任何帮助将不胜感激。能够调用List而不是创建各种变量对我来说要容易得多。
答案 0 :(得分:0)
我相信您可以将.toString()
添加到您的表达式中,例如:
`${__BeanShell(${allPositiveAffects}.get(1).toString())}`
顺便说一下,Beanshell有一些性能开销,所以我宁愿建议通过JSON Path Extractor JMeter Plugins包获得Extras with Libs Set,它应该更方便,更少消耗资源。
请参阅Using the XPath Extractor in JMeter(向下滚动到“解析JSON”)以获取安装说明和一些JSON Path语言参考示例。