如何在JMeter提取器中基于Flag=false条件从指定JSON提取并捕获所有日期与ID(排除Flag=true条目)
在JMeter中提取Flag=false对应的日期与ID值
针对你的需求——从给定JSON里筛选出所有Flag=false的条目,并提取对应的日期和ID,我推荐两种实现方式,其中Groovy脚本的方案更适配你这种带有动态日期键的JSON结构:
方法1:用JSR223 PostProcessor(Groovy脚本,首推)
Groovy处理嵌套、动态键的JSON非常顺手,能精准定位所有符合条件的条目,还能保证日期和ID一一对应。
操作步骤:
- 在返回该JSON的HTTP请求下面,添加一个JSR223 PostProcessor。
- 把下面的Groovy代码粘贴到
Script输入框里:
import groovy.json.JsonSlurper // 解析响应的JSON数据 def jsonResponse = new JsonSlurper().parse(prev.getResponseData()) def dateMap = jsonResponse.data.availabilityDates // 用来存符合条件的日期和ID def validDates = [] def validIds = [] // 遍历每个日期对应的条目列表 dateMap.each { dateStr, items -> // 挑出当前日期下Flag为false的条目 def matchedItems = items.findAll { item -> !item.Flag } matchedItems.each { item -> validDates.add(dateStr) validIds.add(item.id) } } // 把结果存入JMeter变量,方便后续使用 vars.putObject("valid_dates", validDates) vars.putObject("valid_ids", validIds) // 如果需要逗号分隔的字符串格式(比如传给后续请求): vars.put("valid_dates_str", validDates.join(",")) vars.put("valid_ids_str", validIds.join(","))
脚本说明:
- 先解析响应JSON,定位到存储日期的
availabilityDates节点。 - 逐个遍历日期键,筛选出该日期下
Flag=false的条目,把日期和对应ID分别存入列表。 - 最终你可以通过
${valid_dates}、${valid_ids}获取列表形式的结果,或者用${valid_dates_str}、${valid_ids_str}获取逗号分隔的字符串,方便在后续JMeter元件中引用。
方法2:用JSON Path Extractor(仅提取ID,需额外处理日期)
如果只想用JMeter自带的JSON Path提取器,可以先提取所有Flag=false的ID,但对应的日期没法直接通过JSON Path获取(因为日期是动态的父级键),所以这个方法适合只需要ID的场景,或者你愿意额外处理日期的情况。
提取ID的配置:
- 在请求下添加JSON Path Extractor。
- 按下面配置:
- Variable Name:
matched_ids - JSON Path Expression:
$..data.availabilityDates.*[?(@.Flag == false)].id - Match No.:
-1(表示提取所有匹配的结果,而不是只取第一个) - Default Value:
NO_MATCH
- Variable Name:
配置完成后,JMeter会把所有符合条件的ID存为matched_ids_1、matched_ids_2这样的变量,或者用${matched_ids}获取逗号分隔的所有ID。但要获取对应的日期,还是得用方法1的Groovy脚本更高效。
验证提取结果
你可以添加一个Debug Sampler,然后在查看结果树里查看valid_dates、valid_ids这些变量的值,确认是否正确提取了以下条目:
- 日期
2021-07-22,IDXYZ - 日期
2021-07-03,IDXYZ02 - 日期
2021-07-25,IDXYZ03 - 日期
2021-07-09,IDXYZ04
内容的提问来源于stack exchange,提问作者user16298800
相关产品推荐
相关产品推荐

