如何在JMeter中随机提取JSON里Options的子项及对应Values?
嘿,我来帮你搞定这个需求,步骤很清晰,跟着来就行:
方法一:用JSON Extractor + 内置函数(可视化配置,适合新手)
这种方式不需要写代码,全靠JMeter自带的元件配置就能完成:
1. 先提取完整的Options数组
添加一个JSON Extractor到你的请求后面,配置如下:
- 变量名:
all_options - JSON Path表达式:
$.options - 匹配数字:
-1(表示提取数组里所有的Option元素) - 其他保持默认即可
这一步会把JSON里的所有Option都提取出来,同时JMeter会自动生成${all_options_matchNr}变量,代表提取到的Option总数。
2. 随机选一个Option的索引
用JMeter的__Random()内置函数生成一个随机索引(数组索引从0开始),把这个索引存到变量里。你可以在User Defined Variables里添加,或者直接在后续元件中引用:
${__Random(0,${all_options_matchNr}-1,selected_option_index)}
这里selected_option_index就是我们选中的那个Option的索引变量。
3. 提取选中Option的Values数组
再添加一个JSON Extractor,针对刚才选中的Option提取它的Values数组:
- 变量名:
selected_option_values - JSON Path表达式:
$.options[${selected_option_index}].values - 匹配数字:
-1
同样,JMeter会生成${selected_option_values_matchNr}变量,代表这个Option下的Value总数。
4. 随机选一个Value的索引
还是用__Random()函数生成Value的随机索引:
${__Random(0,${selected_option_values_matchNr}-1,selected_value_index)}
selected_value_index就是选中的Value的索引。
5. 提取最终需要的字段
如果需要获取选中Option的code、label,或者Value里的具体内容(假设Value有字段的话),再添加JSON Extractor即可。比如:
- 提取选中Option的Label:
- JSON Path表达式:
$.options[${selected_option_index}].label - 变量名:
selected_option_label
- JSON Path表达式:
- 提取选中Value的内容(假设Value有
value字段):- JSON Path表达式:
$.options[${selected_option_index}].values[${selected_value_index}].value - 变量名:
selected_value
- JSON Path表达式:
方法二:用JSR223 Sampler(代码方式,更灵活高效)
如果觉得多个JSON Extractor太繁琐,可以直接用JSR223 Sampler写Groovy代码一次性处理,效率更高:
添加一个JSR223 Sampler,选择Groovy语言,然后粘贴以下代码:
import groovy.json.JsonSlurper // 假设你的接口返回的JSON存在变量"response"里,如果是直接用固定JSON,就把下面的字符串换成你的JSON def jsonString = vars.get("response") ?: '''{ "id":37, "merchant_id":"39", "title":"Parker Pens", "subtitle":null, "price":1000, "description":null, "images":[ ], "image_thumbs":[ ], "options":[ { "code":"color", "label":"Color", "extra_info":"", "values":[ { "value":"red" }, { "value":"blue" }, { "value":"black" } ] }, { "code":"size", "label":"Size", "extra_info":"", "values":[ { "value":"small" }, { "value":"medium" }, { "value":"large" } ] } ],"options_available":[ { }, { } ] }''' def jsonData = new JsonSlurper().parseText(jsonString) // 随机挑选一个Option def randomOption = jsonData.options.getAt(new Random().nextInt(jsonData.options.size())) // 随机挑选这个Option下的一个Value def randomValue = randomOption.values.getAt(new Random().nextInt(randomOption.values.size())) // 把结果存到JMeter变量里,方便后续请求使用 vars.put("selected_option_code", randomOption.code) vars.put("selected_option_label", randomOption.label) // 如果Value有具体字段,比如value,就存对应的内容 vars.put("selected_value", randomValue.value ?: "")
代码里我给Values加了示例字段,你可以根据实际JSON结构调整字段名。运行后,你就能在后续元件里用${selected_option_code}、${selected_value}这些变量了。
内容的提问来源于stack exchange,提问作者Siddish

