如何在没有 Jmeter 中的 foreach 控制器的情况下从数组中提取值(通过 JSON 提取器获得)
Posted
技术标签:
【中文标题】如何在没有 Jmeter 中的 foreach 控制器的情况下从数组中提取值(通过 JSON 提取器获得)【英文标题】:How to extract a value from an array (obtained through JSON extractor) without foreach controller in Jmeter 【发布时间】:2021-04-29 16:21:16 【问题描述】:我正在处理 Jmeter 的一些问题。我向 API 发出 HTTP 请求,该 API 以 JSON 形式回答我,因此我使用 JSON 提取器来提取我需要的信息(我使用 JSON 路径表达式“$.asset_host”来获取并将其存储在名为“data”的变量中)。所以现在我有一个变量,它是一个名为“data”的数组,其中 data[0] = asset_host。
问题是我需要在下一个 HTTP 请求中使用此信息,但我不知道如何在不使用 foreach 控制器的情况下从“数据”获取asset_host。我尝试了 $data[0]、$data[0] 和 $data_0,但它不起作用.
请问有人知道如何在数组数据的键 0 处获取asset_host 值吗?
编辑
这是 JSON 响应:
"chat_web_socket_port": "9009",
"assets_server": "\/\/assets.local",
"chat_web_socket_host": "chat",
"chat_web_socket_secure": false
Here the JSON extractor
EDIT_2
好的,我找到了它不起作用的原因。 JSON响应给了我“//assets.local”,所以如果我在下一个请求中使用它作为主机,它会将“//assets.local”作为主机,这就是它不起作用的原因。我将不得不操纵字符串来删除“//”。
EDIT_3
好的,为了完成这篇文章,我使用了一个 JSR223 采样器来操作字符串并删除“//”。我把代码放在这里,也许对以后的人有帮助。
String assets = vars.get("assetServerHost_1");
String newAssets = assets.replace('//', '');
vars.put("hostForAssets", newAssets);
它正在将“//assets.local”更改为“assets.local”
感谢您的阅读和帮助。
【问题讨论】:
【参考方案1】:没有看到你的测试计划,你的 JSON Extractor 配置和 JSON 响应,很难说是什么问题,有太多可能的失败原因,最常见的一个是 JSON Extractor 放置不正确(参见JMeter Scoping Rules用户手册章节了解更多详情)
盲拍:
将0
放入“匹配编号:字段:
这样您就可以将所需的值称为$data
-
如果你有
-1
那里 - 那么很可能你有 $data_1
变量和 $data_matchNr
变量保存匹配的数量
您可以使用 Debug Sampler and View Results Tree listener combination 检查 JSON 提取器生成了哪些变量
【讨论】:
感谢您的回答。我试图在“匹配号”中输入 0。领域,但它不起作用。它给了我“/”而不是我用 -1 的值。但是当我将 -1 放在同一个字段中时,如果我尝试使用 $data_1 它会向主机“$data_1”发出下一个请求,因此它不起作用。我试图找到调试采样器但我没有它,它是一个插件吗?再次感谢您尝试帮助我。【参考方案2】:你能检查一下Debug Sampler
中的数据吗?
我的猜测是:如果 $.asset_host
是一个数组,那么 jmeter 将创建单独的变量为 data_1
、data_2
、....data_n
数组的第一个元素是data_1
以下编辑
调试采样器在 Jmeter 中是开箱即用的。详情here.
我使用了这个示例 JSON
"name": "John",
"age": 30,
"cars": [
"Ford",
"BMW",
"Fiat"
],
"asset_host": "test string"
我的 JSON 提取器配置
请注意Match No
应该等于0
下面是 Debug Sampler 中提取的值
【讨论】:
感谢您帮助我。是 Jmeter 中的调试采样器和插件吗?我现在看不到。 $.asset_host 不是数组,它是 json 响应中的简单字符串,但是当我使用 JSON 提取器时,它会提取到数组中......所以我尝试使用 $data_1 访问它,但它不起作用. 根据上述回复编辑我的答案以增加清晰度 感谢您的“编辑”部分。最后我找到了为什么它不起作用。 JSON响应给我“//assets.local”作为响应,所以如果我在下一个请求采样器中使用它会将“//assets.local”放在主机中,这就是它不起作用的原因。所以我必须找到一种方法来操作字符串并删除 $data_1 开头的“//”。感谢您的帮助,现在我可以拥有一个有用的调试采样器! 很高兴您能够更正脚本。但是,您不必使用$data_1
。由于这不是数组,您可以通过$data
访问它以上是关于如何在没有 Jmeter 中的 foreach 控制器的情况下从数组中提取值(通过 JSON 提取器获得)的主要内容,如果未能解决你的问题,请参考以下文章
JMeter基础 — JMeter中ForEach控制器详解