Postman变量在JSON中必须按类型加引号:数字可不加,字符串必须加双引号,布尔/null需存原始值;错误源于模板替换不自动补引号,应通过Console查raw body并用JSONLint验证。

Postman变量未加双引号导致JSON parse error
Postman里用{{variable_name}}引用变量时,如果直接塞进 JSON body 里不加双引号,JSON 解析器会把它当 JavaScript 标识符或非法 token 处理,立刻报 Unexpected character 或 Unexpected token 'b' 这类错误。
根本原因不是变量内容有问题,而是 JSON 语法被破坏了:JSON 要求所有字符串字段名和值必须用双引号包裹,而 {{variable_name}} 属于模板占位符,Postman 在发送前做文本替换,不会自动补引号。
- 错误写法:
{"id": {{user_id}}, "name": {{user_name}}→ 替换后变成{"id": 123, "name": admin},admin缺少引号,非法 - 正确写法:
{"id": {{user_id}}, "name": "{{user_name}}"→ 替换后是{"id": 123, "name": "admin"},合法 - 数字类型变量(如
id)可不加引号;字符串类型变量(如name、token)必须加双引号 - 布尔或 null 值变量不能直接插——
{{is_active}}若值为true,加引号就变成字符串"true",语义错;此时应确保变量本身存的是原始 JSON 值(如pm.globals.set("is_active", true)),再用{{is_active}}不加引号
Postman Console 查看真实发送的 raw body
光看编辑区的 JSON 写法没用,真正决定是否报错的是 Postman 实际发出去的原始字节流。很多开发者卡在“明明写了双引号,还是报错”,就是因为变量展开后引入了不可见字符或嵌套引号冲突。
必须打开 View → Show Postman Console,点开对应请求的 Body 标签页,看 raw 内容。这才是服务端收到并尝试解析的字符串。
- 常见陷阱:变量值本身含双引号(如
user_name = "O'Reilly"),直接写"{{user_name}}"会导致"O'Reilly"→ JSON 合法;但若值是He said "hi",就会变成"He said "hi"",破坏结构 - 此时需提前转义:用
pm.variables.replaceIn()或 Pre-request Script 清洗,例如const safe = pm.variables.replaceIn('"{{user_name}}"').replace(/"/g, '\"'); - 别依赖
pm.request.body.raw在 Tests 里打印——它读的是编辑态,不是发送态
Content-Type 和 JSON 校验工具配合使用
即使 JSON 格式完全正确,Content-Type: application/json 缺失或写错(比如写成 application/json;charset=UTF-8 某些老服务会拒收),后端也可能抛出看似 JSON 解析失败的异常。
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
建议把三件事串起来验证:
- 检查 Headers 里
Content-Type是否严格等于application/json - 从 Postman Console 复制 raw body,粘贴到 JSONLint 验证——注意要选“Validate JSON”而非“Beautify”,后者会静默修复错误掩盖问题
- 若校验通过但服务端仍报错,大概率是服务端 Jackson/FastJSON 等库开启了严格模式,拒绝带 BOM、尾随逗号、单引号等“非标准但常见”的输入,这时得看服务端日志具体提示哪一行哪个字符
环境变量/全局变量中存 JSON 片段的风险
有人图省事,在变量里存整个 JSON 字段,比如 pm.globals.set("payload_part", '"name": "Alice", "age": 30'),然后在 body 里写 { {{payload_part}} }。这非常危险。
这种写法绕过了 Postman 的 JSON 编辑校验,极易拼出语法错误,且无法被 JSONLint 直接识别(因为变量内容只是字符串片段)。
- 推荐替代方案:用 Pre-request Script 构造完整 JSON 对象,再转成字符串赋给一个变量,例如:
const obj = {name: pm.variables.get("name"), age: pm.variables.get("age")}; pm.variables.set("full_payload", JSON.stringify(obj));,body 中直接写{{full_payload}} - 避免在变量中存带引号、逗号、花括号的“半成品”,那不是变量,是隐患
- 尤其注意:
JSON.stringify()会自动处理引号转义和 Unicode,比手动拼接可靠得多
Postman 变量引发的 JSON 错误,90% 都卡在「以为变量是值,其实它是字符串占位符」这个认知偏差上。最稳的排查路径就是:Console 看 raw → JSONLint 校验 → 对照变量原始值反推引号需求。别跳步。










