从 JMeter json 数组中获取随机元素的索引 Json 路径 Post 处理器
Obtain index of random element from json array in JMeter Json Path Post Processor
我有一个奇怪的 jmeter 案例。假设我们有一个 json 数组,其元素如下:
{
"id" : 123456,
"name": "TEST"
}
所以我想从具有 id
的数组中获取随机元素。对于这种情况,我使用 Json Path PostProcessor
和这样的表达式 $.elements[?(@.id)]
但出于某些原因,我需要该元素的索引。所以我可以创建 BeanShellPostProcessor
生成随机索引,然后使用相同的 Json Path PostProcessor
和这样的表达式 $.elements[${PARAM_ElementIndex}]
。
但在某些情况下,这个数组可以为空, Json Path PostProcessor
会失败,异常如下:
jmeter.extractor.json.jsonpath.JSONPostProcessor: Error processing JSON content in PARAM_ResumeId, message:No results for path: $['elements'][0]['id']
所以可能有人可以提出任何解决方案
我建议使用 Groovy 而不是 Beanshell,因为:
- 良好的Groovy脚本可以编译成字节码因此性能会高很多
- Groovy 内置 JSON 支持
假设您有 JSON 响应,例如:
{
"elements": [
{
"id": 123456,
"name": "TEST"
},
{
"id": 7890,
"name": "TEST2"
}
]
}
您可以在 JSR223 后处理器中使用以下示例 Groovy 代码提取随机 ID 及其索引:
import groovy.json.JsonSlurper
import java.util.concurrent.ThreadLocalRandom
String response = prev.getResponseDataAsString()
def jsonSlurper = new JsonSlurper()
def json = jsonSlurper.parseText(response)
int size = json.elements.size
if (size > 0){
def randomIndex = ThreadLocalRandom.current().nextInt(size)
def value = json.elements.get(randomIndex).id
log.info('Index: ' + randomIndex)
log.info('Value: ' + value)
}
演示:
参考文献:
我有一个奇怪的 jmeter 案例。假设我们有一个 json 数组,其元素如下:
{
"id" : 123456,
"name": "TEST"
}
所以我想从具有 id
的数组中获取随机元素。对于这种情况,我使用 Json Path PostProcessor
和这样的表达式 $.elements[?(@.id)]
但出于某些原因,我需要该元素的索引。所以我可以创建 BeanShellPostProcessor
生成随机索引,然后使用相同的 Json Path PostProcessor
和这样的表达式 $.elements[${PARAM_ElementIndex}]
。
但在某些情况下,这个数组可以为空, Json Path PostProcessor
会失败,异常如下:
jmeter.extractor.json.jsonpath.JSONPostProcessor: Error processing JSON content in PARAM_ResumeId, message:No results for path: $['elements'][0]['id']
所以可能有人可以提出任何解决方案
我建议使用 Groovy 而不是 Beanshell,因为:
- 良好的Groovy脚本可以编译成字节码因此性能会高很多
- Groovy 内置 JSON 支持
假设您有 JSON 响应,例如:
{
"elements": [
{
"id": 123456,
"name": "TEST"
},
{
"id": 7890,
"name": "TEST2"
}
]
}
您可以在 JSR223 后处理器中使用以下示例 Groovy 代码提取随机 ID 及其索引:
import groovy.json.JsonSlurper
import java.util.concurrent.ThreadLocalRandom
String response = prev.getResponseDataAsString()
def jsonSlurper = new JsonSlurper()
def json = jsonSlurper.parseText(response)
int size = json.elements.size
if (size > 0){
def randomIndex = ThreadLocalRandom.current().nextInt(size)
def value = json.elements.get(randomIndex).id
log.info('Index: ' + randomIndex)
log.info('Value: ' + value)
}
演示:
参考文献: