旧版Postman中变量值本质是字符串,{{var}}插值不自动解析JSON,需用postman.getEnvironmentVariable()获取后配合JSON.parse()转换,并加try/catch处理异常。

旧版 Postman(不支持 pm 对象)中,变量值本质是字符串,即使你存的是 {"id":1,"name":"test"},它也只是被当作文本存储——直接在请求体里写 {{my_json_var}} 会原样插入,不会自动解析成结构化对象。必须手动用 JSON.parse() 转换,否则后续取值、遍历、断言都会失败。
为什么 {{my_json_var}} 直接用会报错或取不到字段
Postman 的变量插值是纯字符串替换:它不关心你存的值是不是合法 JSON,也不会自动调用 JSON.parse()。比如你在环境变量里设了 user_info = {"id":123,"role":"admin"},然后在 Body 里写 {"data":{{user_info}}},实际发出的请求体是:
{"data":{"id":123,"role":"admin"}}
这看似没问题,但如果你在 Tests 里写 var u = {{user_info}};,JS 解析器会报 SyntaxError: Unexpected token { —— 因为它试图把未加引号的 {...} 当作 JS 对象字面量,而变量插值后没有引号包裹。
常见错误现象:
-
ReferenceError: user_info is not defined(误以为变量是 JS 变量) -
SyntaxError: Unexpected token {或Unexpected token u in JSON at position 0(u来自undefined字符串) -
Cannot read property 'id' of undefined(没 parse 就直接点属性)
JSON.parse() 必须配合 postman.getEnvironmentVariable() 使用
旧版 Postman 提供的变量读取方法只有 postman.getEnvironmentVariable()、postman.getGlobalVariable(),它们返回的全是字符串。要转对象,必须显式调用 JSON.parse(),且需加 try/catch 防止非法 JSON 导致脚本中断。
正确做法:
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
- 先用
postman.getEnvironmentVariable("user_info")拿到字符串 - 再用
JSON.parse()解析,例如:var u = JSON.parse(postman.getEnvironmentVariable("user_info")); - 必须包裹 try/catch,因为变量可能为空、格式错误或含单引号(
JSON.parse()不接受单引号)
示例(Tests 标签页):
try {
var raw = postman.getEnvironmentVariable("user_info");
if (!raw) throw new Error("user_info is empty");
var u = JSON.parse(raw);
tests["user id is number"] = typeof u.id === "number";
tests["user role exists"] = u.role && u.role.length > 0;
} catch (e) {
console.error("Failed to parse user_info:", e.message);
tests["JSON parse failed"] = false;
}
预处理脚本里怎么把对象再塞回请求体(如 biz_content)
如果请求体是 JSON 格式,且你需要把某个变量(如 biz_content)解析后修改字段、再序列化回去,不能直接改 request.data 字符串——它不可靠(格式易破坏、缩进丢失)。正确路径是:解析整个 body → 修改对象 → JSON.stringify() 回去。
关键点:
- 旧版用
request.data获取原始 body 字符串,必须先JSON.parse()成对象 - 修改完后,必须用
JSON.stringify()转回字符串,再赋给request.data - 若
biz_content本身是嵌套 JSON 字符串(即双层 JSON),需先JSON.parse()外层,再对biz_content字段单独JSON.parse()→ 修改 →JSON.stringify()→ 赋值回对象 → 最终JSON.stringify()整个 body
简化示例(Pre-request Script):
try {
var body = JSON.parse(request.data);
var biz = JSON.parse(body.biz_content); // 先解外层,再解 biz_content 字符串
biz.timestamp = Date.now(); // 修改 biz_content 内部字段
body.biz_content = JSON.stringify(biz); // 再包一层成字符串
request.data = JSON.stringify(body); // 最后整体序列化
} catch (e) {
console.error("Pre-request parse error:", e.message);
}
容易忽略的三个坑
一是变量值里混了单引号或尾逗号——JSON.parse() 会直接炸,别指望后端兼容;二是环境变量里存了未转义的双引号(如 {"msg":"he said "hi""}),必须提前用 .replace(/"/g, '\"') 处理;三是 request.data 在 Pre-request 脚本中不是响应式更新的,改了之后必须重新赋值,只改 body 对象不生效。










