Jmeter(118)-json提取器如何直接提取响应是数组的值

有时候响应的数据直接是一个数组的情况下,也可以用json提取器进行值的提取

比如,如下这种格式

目的是想提取这个数组下的每个值对应一行数据,以提取这几个数据为例

<think>我们被要求使用JMeterJSON提取器提取响应参数并写入本地文件。根据引用[3],我们可以使用JSON提取器提取多个参数,然后使用Beanshell后置处理器将提取的参数写入本地CSV文件。 步骤: 1. 添加JSON提取器:用于从JSON响应提取需要的参数。 2. 添加Beanshell后置处理器:编写脚本将提取的参数写入CSV文件。 详细步骤: ### 1. 添加JSON提取器 假设我们的HTTP请求返回的JSON响应如下: ```json { "data": [ { "id": 1, "name": "Alice" }, { "id": 2, "name": "Bob" } ] } ``` 我们想要提取每个元素的id和name。 - 在HTTP请求下添加JSON提取器(右键点击HTTP请求 -> 添加 -> 后置处理器 -> JSON提取器- 配置JSON提取器- Names of created variables: 填写变量名,比如`id;name`(注意:这里用分号分隔多个变量名) - JSON Path expressions: 填写对应的JSON路径,比如`$.data[*].id;$.data[*].name` - Match No. (0 for Random): 默认-1(表示所有匹配项) - Compute concatenation var: 如果需要将所有匹配连接成一个字符串,可以勾选(这里不勾选) 这样,提取器会生成两组变量:`id_1, id_2, ...` 和 `name_1, name_2, ...`,同时还会生成两个变量表示匹配的数量:`id_matchNr`和`name_matchNr`(实际上,因为我们是同时提取两个变量,所以匹配数量应该相同,我们可以用其中一个,比如`id_matchNr`)。 ### 2. 添加Beanshell后置处理器 接下来,我们需要将提取变量写入CSV文件。我们可以使用Beanshell后置处理器(或者JSR223后置处理器,推荐使用Groovy,因为性能更好,但这里按照引用[3]使用Beanshell)。 - 在同一个HTTP请求下(或线程组级别,根据需求)添加Beanshell后置处理器(右键点击 -> 添加 -> 后置处理器 -> BeanShell后置处理器) - 在Beanshell脚本区域编写脚本: ```java import java.io.BufferedWriter; import java.io.FileWriter; // 获取匹配的数量 String matchNum = vars.get("id_matchNr"); // 因为我们提取了id,所以用id_matchNr int num = Integer.parseInt(matchNum); // 打开文件,true表示追加模式,如果不需要追加则改为false FileWriter fstream = new FileWriter("D:\\output.csv", true); // 文件路径,请根据实际情况修改 BufferedWriter out = new BufferedWriter(fstream); // 循环写入每一行 for (int i=1; i<=num; i++) { // 获取变量 String id = vars.get("id_" + i); String name = vars.get("name_" + i); // 写入一行,用逗号分隔 out.write(id + "," + name); out.newLine(); // 换行 } // 关闭文件 out.close(); fstream.close(); ``` 注意:如果文件不存在,FileWriter会创建文件;如果存在,且设置为追加模式(true),则会在文件末尾追加。如果不想追加,而是每次覆盖,则改为false(或者不写,默认是覆盖,但注意如果多个线程同时写可能会冲突,建议根据测试计划结构调整)。 ### 3. 注意事项 - 如果JSON提取器提取变量名有多个,需要确保在Beanshell脚本中正确引用。 - 如果响应数据量很大,注意性能问题,可以考虑使用JSR223+Groovy。 - 写入文件路径请确保JMeter有权限写入。 ### 示例结构 - 线程组 - HTTP请求 - JSON提取器 - BeanShell后置处理器 ### 完整示例(根据引用[3]调整) 引用[3]中的例子是提取多个参数并写入CSV,我们这里也是类似。他们使用了`categoryName_matchNr`等变量,我们则使用`id_matchNr`和`name_matchNr`。 ### 相关问题 §§相关问题§§ 1. 如何避免JMeter在写入文件时出现并发问题? 2. 除了Beanshell,还有哪些方法可以将提取的数据写入文件? 3. 如何确保JSON提取器正确提取了数据?</think>### JMeter JSON提取器提取响应数据并保存到本地文件 #### 步骤1:添加JSON提取器 1. **在HTTP请求下添加JSON提取器** - 右键点击HTTP请求 → 添加 → 后置处理器 → JSON提取器 - 配置参数: - **Names of created variables**:输入变量名(如 `id;name`,用分号分隔多个变量- **JSON Path expressions**:填写JSON路径表达式(如 `$.data[*].id;$.data[*].name`) - **Match No.**:设为 `-1`(提取所有匹配项)[^4] - **Compute concatenation var**:勾选(生成 `_matchNr` 计数变量) 2. **JSON路径示例** -提取:`$.data.id` -提取:`$.data[*].items`(提取数组所有元素) - 嵌套提取:`$..address.city`(递归提取所有城市名) #### 步骤2:添加调试器(可选) - 添加 **调试后置处理器** → 查看提取变量(如 `id_1`, `name_1`, `id_matchNr`) #### 步骤3:写入本地文件 **方法1:使用BeanShell后置处理器**(引用[3]) ```java import java.io.*; // 获取匹配数量 String matchNum = vars.get("id_matchNr"); int num = Integer.parseInt(matchNum); // 创建文件写入流(true表示追加模式) FileWriter fstream = new FileWriter("D:\\data.csv", true); BufferedWriter out = new BufferedWriter(fstream); // 循环写入数据 for (int i=1; i<=num; i++) { String id = vars.get("id_" + i); String name = vars.get("name_" + i); out.write(id + "," + name + "\n"); } out.close(); fstream.close(); ``` **方法2:使用JSR223后置处理器(Groovy)**(推荐,性能更优) ```groovy def matchNum = vars.get('id_matchNr') as Integer def file = new File('D:/data.csv') matchNum.times { index -> int i = index + 1 def id = vars.get("id_$i") def name = vars.get("name_$i") file << "$id,$name\n" } ``` #### 关键配置说明 1. **变量命名规则** - 提取器生成格式:`变量名_1`, `变量名_2`... `变量名_matchNr` - 例如 `id_1`, `id_2`, `id_matchNr=2`[^2] 2. **文件路径处理** - 绝对路径:`D:/data.csv`(Linux/Mac用`/tmp/data.csv`) - 相对路径:`${__P(user.dir)}/results.csv`(JMeter启动目录) 3. **并发写入安全** - 加同步锁(BeanShell): `synchronized(this) { ...文件操作... }` - 使用`__threadNum`区分文件: `FileWriter("data_${__threadNum}.csv")` #### 验证结果 1. 查看CSV文件内容: ```csv 101,Alice 102,Bob ``` 2. 使用 **查看结果树** 检查提取过程 3. 通过 **聚合报告** 监控文件写入性能 > ⚠️ **注意**:生产环境建议用Groovy替代BeanShell(性能提升10倍)[^3],且路径权限需确保JMeter有写入权。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

agrapea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值