Postman中JSON的number字段不能直接用{{var}}插值,因变量插值默认为字符串行为,导致数字被加引号而非法;正确做法是在Pre-request Script中构造JS对象并JSON.stringify后赋值给pm.request.body.raw。

Postman 里直接把变量塞进 JSON 的 number 字段会报错或被当成字符串,根本原因是:JSON 中的数字不能带引号,而 Postman 变量插值({{var}})默认是字符串行为,哪怕你存的是 123,插进去后也会变成 "123" —— 这在 JSON 校验时直接非法。
JSON body 中引用数值型变量必须用 Pre-request Script
不能靠 {{id}} 直接写在 raw JSON 里。Postman 不会在解析 JSON 前做类型推断,它只做字符串替换。所以你看到 "id": {{id}} 实际发出去的是 "id": "123"(带引号),不是 "id": 123(纯数字)。
正确做法是在 Pre-request Script 里拼 JSON 对象,再用 pm.request.body.raw 覆盖原始 body:
- 在请求的 Pre-request Script 标签页写:
const id = pm.environment.get("news_id"); // 假设已存为 number 类型环境变量 const payload = { "id": id, // 这里是真正的 JS number,不是字符串 "title": "测试文章", "status": 1 }; pm.request.body.raw = JSON.stringify(payload); - Body 类型仍选
raw+JSON(application/json),但内容清空——脚本会动态填入合法 JSON - 确保
news_id是以 number 类型存的:pm.environment.set("news_id", 1001),而不是"1001"
从响应提取 JSON 数字字段并保留类型
很多人用 pm.environment.set("id", data.data.id) 提取响应里的数字,结果发现后续用 {{id}} 还是当字符串处理。这是因为 pm.environment.set() 总是存为字符串,无论你传的是 42 还是 "42"。
要真正保留数字类型,必须跳过环境变量,改用局部变量或直接在脚本里流转:
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
- 提取时别存环境变量,直接在 Pre-request Script 里用:
const resp = pm.response.json(); const id = resp.data.id; // id 是 JS number pm.request.body.raw = JSON.stringify({ id, title: "xxx" }); - 如果必须跨请求传递,用
pm.collectionVariables.set("id", id),它支持原生 JS 类型(包括 number、boolean),且pm.collectionVariables.get("id")取出来仍是 number - 避免用
pm.environment.set()存数值,除非你确定后续只在 Pre-request Script 里取,并手动parseInt()或Number()转型
用内置变量生成数字时注意类型陷阱
{{$randomint}} 看似是数字,但它在 JSON body 里直接插值仍是字符串。比如 "count": {{$randomint}} 发出去是 "count": "842"。
解决方法只有两个:
- 放弃插值,改用 Pre-request Script:
pm.request.body.raw = JSON.stringify({ count: Math.floor(Math.random() * 1000) }); - 或用
pm.variables.replaceIn()配合正则强制转义(不推荐,易出错) - 别信文档里“变量可自动识别类型”的说法——Postman 的变量系统本质是字符串模板引擎,数字类型只在 JS 执行上下文里存在
最常被忽略的一点:即使你用 collectionVariables 存了 number,一旦你在 Body 的 raw JSON 里写 {{id}},它就立刻退化成字符串。数值变量真正在 Postman 里“活”着的地方,只有 JavaScript 执行期;只要经过双花括号插值,就落地为字符串。










