如何在 Jmeter 中没有 foreach 控制器的情况下从数组中提取值(通过 JSON 提取器获得)
How to extract a value from an array (obtained through JSON extractor) without foreach controller in Jmeter
我正在处理 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
好的,为了完成这个 post,我使用了 JSR223 采样器来操作字符串并删除了“//”。我把代码放在这里,也许它对以后的人有帮助。
String assets = vars.get("assetServerHost_1");
String newAssets = assets.replace('//', '');
vars.put("hostForAssets", newAssets);
正在将“//assets.local”更改为“assets.local”
感谢您的阅读,感谢您的帮助。
你能检查一下 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 中看到的提取值
如果没有看到您的测试计划、您的 JSON 提取器配置和 JSON 响应,很难说出了什么问题,有太多可能的失败原因,最常见的一个是不正确的放置JSON 提取器(有关详细信息,请参阅 JMeter Scoping Rules 用户手册章节)
盲拍:
将0
放入“匹配号:字段:
这样您就可以将所需的值引用为 ${data}
- 如果你有
-1
- 那么很可能你有 ${data_1}
变量和 ${data_matchNr}
保存匹配数的变量
您可以使用 Debug Sampler and View Results Tree listener combination
检查 JSON 提取器生成了哪些变量
我正在处理 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
好的,为了完成这个 post,我使用了 JSR223 采样器来操作字符串并删除了“//”。我把代码放在这里,也许它对以后的人有帮助。
String assets = vars.get("assetServerHost_1");
String newAssets = assets.replace('//', '');
vars.put("hostForAssets", newAssets);
正在将“//assets.local”更改为“assets.local”
感谢您的阅读,感谢您的帮助。
你能检查一下 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 中看到的提取值
如果没有看到您的测试计划、您的 JSON 提取器配置和 JSON 响应,很难说出了什么问题,有太多可能的失败原因,最常见的一个是不正确的放置JSON 提取器(有关详细信息,请参阅 JMeter Scoping Rules 用户手册章节)
盲拍:
将
0
放入“匹配号:字段:
这样您就可以将所需的值引用为 ${data}
- 如果你有
-1
- 那么很可能你有${data_1}
变量和${data_matchNr}
保存匹配数的变量
您可以使用 Debug Sampler and View Results Tree listener combination
检查 JSON 提取器生成了哪些变量