旧版Postman预请求脚本中需对biz_content内嵌object(非Array)递归执行JSON.stringify并双重转义双引号和反斜杠,其他字段保持原样,且必须先JSON.parse(request.data)再JSON.stringify(data)写回,否则请求体失效。

旧版Postman预请求脚本里怎么递归处理biz_content嵌套对象
旧版Postman不支持pm语法,只能用request.data读写原始请求体,且必须手动JSON.parse/JSON.stringify。核心难点不是“怎么转字符串”,而是“哪些字段要转、什么时候停止递归”。
- 只对
biz_content字段做处理,其他字段(如method、sign)保持原样 - 递归逻辑必须跳过
string、number、null、boolean类型,只对object且非Array的值调用JSON.stringify - 不能直接
JSON.stringify(obj)后塞回去——这会导致双引号被转义成"或反斜杠爆炸,必须用JSON.stringify(val).replace(/"/g, '\"').replace(/\/g, '\\')预处理 - 示例脚本片段:
var data = JSON.parse(request.data); if (data.biz_content) { function stringifyNested(obj) { for (var k in obj) { if (obj.hasOwnProperty(k) && typeof obj[k] === 'object' && obj[k] !== null && !Array.isArray(obj[k])) { obj[k] = JSON.stringify(obj[k]).replace(/"/g, '\"').replace(/\/g, '\\'); stringifyNested(obj[k]); // 注意:此时obj[k]已是字符串,这行实际无效,仅保留结构示意 } } } stringifyNested(data.biz_content); } request.data = JSON.stringify(data);
为什么不能用JSON.stringify(biz_content)一步到位
因为biz_content本身是顶层对象,但它的某些子字段(如info、doclist)需要变成字符串,而其他字段(如user_id、timestamp)仍是普通字段。一步JSON.stringify会把整个biz_content变成一个大字符串,后端收不到结构化字段。
- 错误做法:
data.biz_content = JSON.stringify(data.biz_content)→ 后端收到的是{"biz_content": "{...}"},无法按key取值 - 正确目标:
{"biz_content": {"user_id": 123, "info": "{"name":"Alice"}", "doclist": "[{"id":1}]"}} - 关键点:只对指定嵌套层级的
object值做JSON.stringify,不是对整个biz_content对象
Content-Type设成application/json但后端仍报解析失败
常见于字段值被双重序列化——比如info字段本该是字符串"{"name":"Alice"}",结果被当成JSON对象再解析一次,抛出Unexpected token in JSON at position 1。
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
- 检查预请求脚本是否对同一字段重复执行了
JSON.stringify(例如递归没设终止条件,info被转一次,再进stringifyNested又转一次) - 确认后端接收逻辑:如果用
request.get_json()(Flask)或JSONObject(Java),它默认只解析最外层;若业务代码里又对info字段调了new JSONObject(infoStr),那传入的info必须是合法JSON字符串,不能带多余空格或换行 - 临时验证方法:在预请求脚本末尾加
console.log(request.data),发送前看Console输出是否符合预期格式
form-data里混传文件和JSON字符串怎么避免格式错乱
当Body选form-data时,biz_content必须作为独立文本字段传,且Content-Type必须显式设为text/plain,否则Postman会自动加Content-Type: application/json头,导致multipart边界被破坏。
- 操作路径:Body → form-data → 新增键
biz_content→ 值填{"user_id":123,"info":{"name":"Alice"}}→ 点击该行右侧下拉箭头 → 选择Text→ 再点右侧Content-Type字段 → 改为text/plain - 切勿勾选
JSON选项:form-data模式下没有“JSON”开关,那个选项只在raw模式生效 - 如果后端要求
biz_content是JSON字符串而非对象,那这里填的值本身就该是"{"user_id":123,"info":"{\"name\":\"Alice\"}"}",即已转义好的字符串
最易忽略的一点:旧版Postman的request.data是字符串,不是对象,任何修改都必须先JSON.parse再JSON.stringify,漏掉任意一环都会让请求体变空或格式错乱。别依赖“看起来像JSON”就以为没问题,用console.log打出来看真实内容。










