Jmeter:不使用Foreach控制器时如何从JSON提取器数组中取值
JMeter接口测试中JSON提取值取数与格式适配处理
实际遇到的问题
- 向业务API发送HTTP请求后,接口返回JSON格式响应,配置JSON提取器搭配JSON Path表达式匹配目标字段,将提取结果存入名为
data的变量,最终提取结果为数组结构,数组第0位就是需要的业务目标值 - 不需要使用Foreach控制器做遍历,先后尝试
${data[0]}、${data}[0]、${data_0}三种变量引用写法,均无法正常获取对应值 - 排查后拿到的实际接口返回JSON结构:
{ "chat_web_socket_port": "9009", "assets_server": "//assets.local", "chat_web_socket_host": "chat", "chat_web_socket_secure": false }
- 从JSON提取器获取到的
assets_server字段值带双斜杠前缀(形如//assets.local),如果直接把这个值作为后续请求的Host参数传入,会因为Host格式不合法导致请求异常,必须移除前缀双斜杠才能正常使用
最终解决方案
- 先对齐JSON提取器的变量存储规则:当JSON Path表达式匹配到单个结果时,提取器会自动生成带序号后缀的关联变量,比如设置引用名称为
assetServerHost时,匹配到的单值会存入assetServerHost_1变量,本身不存在数组索引类的变量引用逻辑 - 新增JSR223取样器做字符串格式清洗,核心代码逻辑如下:
// 读取JSON提取器存入的原始host值 String assets = vars.get("assetServerHost_1"); // 移除字符串中的双斜杠前缀 String newAssets = assets.replace('//', ''); // 将清洗后的合规host值存入新变量,供后续请求直接调用 vars.put("hostForAssets", newAssets);
- 处理后原始值
//assets.local会被转换为合规的assets.local格式,后续HTTP请求中直接通过${hostForAssets}引用即可完成参数传递,无需额外添加遍历类控制器
内容的提问来源于stack exchange,提问作者jeff
相关产品推荐
相关产品推荐

