Postman Runner中读JSON文件字段需用{{key}}直接引用,JSON必须为数组格式且UTF-8无BOM;字段名不能含空格或特殊字符,不支持嵌套如{{user.name}};非Runner场景pm.iterationData为null。

Postman Runner 里怎么读 JSON 文件里的字段
Postman 的 Data 变量只在 Collection Runner 执行时生效,且必须用 {{key}} 直接引用 —— 不是 data.key,也不是 pm.variables.get()。
JSON 文件内容必须是数组格式([{...}, {...}]),每个对象代表一次迭代。例如:
[
{"username": "alice", "password": "p1"},
{"username": "bob", "password": "p2"}
]
在请求 URL 或 Body 中直接写 {{username}} 和 {{password}},Runner 会自动按行替换。
- 文件后缀必须是
.json,且编码为 UTF-8(BOM 会报错) - 如果字段名含空格或特殊字符,Postman 会静默忽略该字段,不报错也不渲染
- 嵌套字段(如
{"user": {"name": "a"}})无法通过{{user.name}}访问 ——Data变量不支持点号路径
CSV 文件里布尔值/数字被转成字符串怎么办
Postman 读 CSV 时,所有字段一律当字符串处理,true 变成 "true",123 变成 "123"。这在发 JSON 请求体时容易导致 400 错误。
解决方法只能在 Pre-request Script 里手动转换:
const row = pm.iterationData.toObject();
pm.variables.set("is_active", row.is_active === "true");
pm.variables.set("count", parseInt(row.count, 10));
然后在 Body 中用 {{is_active}} 和 {{count}} —— 这时它们才是布尔和数字类型。
- 不要依赖
data.is_active在脚本外直接使用,它永远是字符串 -
parseInt必须带进制参数(10),否则"08"会被当成八进制解析为0 - 空字段(CSV 中连续逗号)会变成
undefined,parseInt(undefined)返回NaN,需加判断
想在 Tests 脚本里拿到当前数据行,该用哪个对象
不是 pm.data(不存在),也不是 pm.environment(那是环境变量),而是 pm.iterationData。
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
它只在 Runner 运行期间可用,代表当前这一轮迭代的数据行:
const current = pm.iterationData.toObject();
console.log(current.username); // 输出当前行的 username 值
pm.environment.set("last_user", current.username);
-
pm.iterationData.get("key")也能取值,但返回的是原始字符串,不推荐 -
toObject()是安全写法,能正确处理空字段、引号包裹等边界情况 - 如果在非 Runner 场景(比如单个请求点击 Send)里调用,
pm.iterationData是null,直接调用toObject()会报错
为什么 {{xxx}} 在 Body 里不替换,却在 URL 里能换出来
常见原因是 Content-Type 设置冲突:Body 用了 application/json,但变量没被 JSON 解析器识别为合法 JSON 字符串。
比如你写了:
{"id": {{user_id}}, "active": {{is_active}}}
而 user_id 是数字 123、is_active 是布尔 true —— 表面看没问题,但 Postman 实际做的是字符串拼接,最终发出去的是:
{"id": 123, "active": true}
这看起来对,但如果你的变量实际是字符串 "123" 和 "true"(比如来自 CSV),就会变成:
{"id": "123", "active": "true"}
此时后端可能拒收 "true"(期望布尔)。
- 最稳方案:全部用
Pre-request Script构造完整 JSON 对象,再用pm.request.body.raw覆盖 - 临时调试可把 Body 切成
text/plain,看原始替换结果 - 别信预览窗口显示的内容 —— 它不校验 JSON 合法性,只做字符串替换

















