You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JMeter中提取JSON并随机化符合指定条件的数据?

随机提取符合条件的JSON字段并传递至下一个请求

问题背景

需要从服务器返回的以下JSON响应中,每次迭代随机提取title为"Sword of Honour"的书籍的author及其他字段,传递到下一个请求。当前使用带固定索引的JSONPath表达式时,会因索引对应的数据不符合条件而返回空值:

服务器响应JSON:

{
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sword of Honour",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "test_title",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Sword of Honour",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "India",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}

比如使用$..book[1][?(@.title == 'Sword of Honour')].author会返回空值,因为索引1对应的书籍title不符合条件。


解决方案

1. 先筛选所有符合条件的书籍集合

先用JSONPath表达式过滤出所有title等于"Sword of Honour"的书籍对象,得到一个完整的符合条件的数组:

$..book[?(@.title == 'Sword of Honour')]

执行后会得到如下结果数组:

[
    {
        "category": "reference",
        "author": "Nigel Rees",
        "title": "Sword of Honour",
        "price": 8.95
    },
    {
        "category": "fiction",
        "author": "Herman Melville",
        "title": "Sword of Honour",
        "isbn": "0-553-21311-3",
        "price": 8.99
    }
]

2. 从集合中随机选取一个元素

根据你使用的工具/语言,实现随机选取逻辑:

情况1:使用Postman等接口测试工具

在测试脚本中通过JavaScript实现筛选和随机选取,并将字段存入环境变量供下一个请求调用:

// 解析响应JSON
const responseData = pm.response.json();
// 筛选所有title为"Sword of Honour"的书籍
const matchingBooks = responseData.store.book.filter(book => book.title === "Sword of Honour");
// 生成随机索引(范围0到符合条件的书籍数量-1)
const randomIndex = Math.floor(Math.random() * matchingBooks.length);
// 获取随机选中的书籍对象
const randomBook = matchingBooks[randomIndex];
// 将需要的字段存入环境变量
pm.environment.set("randomAuthor", randomBook.author);
pm.environment.set("randomBookPrice", randomBook.price);
pm.environment.set("randomBookCategory", randomBook.category);

之后在下一个请求中,通过{{randomAuthor}}等变量名引用即可。

情况2:使用Python处理

借助jsonpath-ng库筛选,再用random模块随机选取:

import json
import random
from jsonpath_ng import parse

# 假设已获取服务器响应并解析为JSON对象
response_json = {
    # 服务器返回的完整JSON内容
}

# 筛选符合条件的书籍
jsonpath_expr = parse("$..book[?(@.title == 'Sword of Honour')]")
matching_books = [match.value for match in jsonpath_expr.find(response_json)]
# 随机选取一个书籍对象
random_book = random.choice(matching_books)
# 提取需要的字段
target_author = random_book["author"]
target_price = random_book["price"]
# 后续将这些字段值传入下一个请求即可

3. 核心思路

不要先指定数组索引再过滤,而是先过滤得到符合条件的完整集合,再从集合中随机选取,这样就能避免固定索引对应的数据不符合条件的问题。


内容的提问来源于stack exchange,提问作者Kaushal Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 07:54:22