Postman不支持直接在JSON请求体中用{{var}}拼接对象,必须通过Pre-request Script结合JSON.stringify()安全构造。正确做法是:①用脚本生成合法JSON字符串并存为变量,Body中引用;②或用pm.request.body.update()直接写入序列化后的字符串。

Postman 本身不支持直接在请求体中用 {{var1}} {{var2}} 拼出一个合法 JSON 对象,必须显式构造结构。变量只是占位符,不会自动“组合”成嵌套对象 —— 这是新手最常误解的一点。
为什么直接写 {"name": "{{username}}", "age": {{age}} 会失败
常见错误现象:发送后后端收到的是未解析的字符串 {"name": "{{username}}", "age": {{age}},或者解析报错 Unexpected token { / JSON parse error。
根本原因:Postman 只在「请求发送前」做一次变量替换,且仅限于纯文本上下文;如果 Body 类型设为 raw + JSON,但内容里混用了未闭合引号、非数字字段没加引号(如 "age": {{age}} 中 {{age}} 被替换成 abc 就非法),JSON 就会失效。
正确做法必须满足两个条件:
① 所有变量值都经过 JSON 安全转义(尤其含引号、换行的字符串)
② 整个 Body 是语法完整的 JSON 字符串
用 pm.variables.replaceIn() 在 Pre-request Script 中安全拼接
这是最可控的方式,适合需要动态构造嵌套对象(如 {"user": {"name": "...", "tags": [...]}})的场景。
- 把原始 JSON 模板写在
rawbody 里,用占位符(如__NAME__、__AGE__),避开双花括号解析干扰 - 在
Pre-request Script中用 JavaScript 构造真实值,并调用pm.variables.replaceIn()替换 - 确保字符串值用
JSON.stringify()处理,避免引号冲突
示例:
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
// Pre-request Script
const name = pm.environment.get("username") || "test";
const age = pm.environment.get("user_age") || 25;
const tags = ["admin", "vip"];
// 安全序列化,自动处理引号和转义
const payload = {
user: {
name: name,
age: age,
tags: tags
}
};
// 写入临时变量,供 body 引用
pm.variables.set("json_payload", JSON.stringify(payload));
然后 Body 设为 raw + JSON,内容只写:{{json_payload}}
用 pm.request.body.update() 直接覆盖整个请求体
当结构复杂、或需根据条件分支生成不同对象时,绕过模板更可靠。
注意:pm.request.body.update() 必须在脚本末尾执行,否则可能被 Postman 内部逻辑覆盖。
- 只适用于
raw或json类型 Body;若当前是form-data,先得手动切换类型再 update - 传入的必须是字符串,不是 JS 对象 —— 即使是 JSON,也要
JSON.stringify()后再塞进去 - 环境变量或
iterationData的值务必先检查是否为undefined,否则JSON.stringify(undefined)会产出null
示例:
// Pre-request Script
const name = pm.iterationData.get("username") ?? "default";
const email = pm.environment.get("email_prefix") + "@test.com";
pm.request.body.update(JSON.stringify({
profile: {
full_name: name,
contact: { email: email }
},
timestamp: Date.now()
}));
别踩这些坑
容易被忽略的关键点:
-
{{variable}}在rawJSON 里能用,但一旦变量值含双引号、反斜杠或换行,就必然破坏 JSON 结构 —— 此时必须走Pre-request Script+JSON.stringify() - Collection Runner 中若用 CSV 参数化,
pm.iterationData.get("field")返回的是字符串,哪怕 CSV 里写的是123,它也是字符串"123",需parseInt()或parseFloat()才能当数字用 - 全局变量或环境变量若为空,
{{missing_var}}会被替换成空字符串,导致{"id": }这种非法 JSON —— 建议在 Pre-request Script 中统一兜底
真正复杂的对象构造,靠拼字符串模板永远不稳定;把控制权交还给 JavaScript,才是 Postman 处理动态 JSON 的正解。

















