Postman提取嵌套对象值需先调用pm.response.json()解析响应,再用?.安全访问;深层字段需递归遍历;存变量要校验类型、命名规范并确保前置请求执行成功。

Postman 里提取嵌套对象的值,核心就一条:先确保你拿到的是可遍历的 JavaScript 对象,再用点号或方括号一层层往下钻——但绝大多数失败,不是语法写错,而是卡在「没解析」或「类型不对」这一步。
pm.response.json() 必须调用,不能直接用 pm.response.body
很多人写 pm.response.body.pin 或 pm.response.body.data.items[0].id,结果是 undefined。因为 pm.response.body 是原始字符串,不是对象。必须先解析:
-
pm.response.json()返回已解析的 JS 对象(推荐,自动处理格式校验) -
JSON.parse(pm.response.text())也可用,但遇到非法 JSON 会直接报错中断脚本 - 如果响应不是 JSON(比如 HTML 或纯文本),
pm.response.json()会抛出异常,此时应先用pm.response.headers.get('content-type')判断类型
多层取值时,用可选链(?.)防崩溃比 try/catch 更轻量
比如要取 data.user.profile.avatar.url,但中间任意一层可能为 null 或 undefined。硬写 pm.response.json().data.user.profile.avatar.url 会报 Cannot read property 'profile' of undefined。
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
- ES2020+ 环境(Postman v9.15+ 支持)直接用
?.:pm.response.json()?.data?.user?.profile?.avatar?.url - 老版本 Postman 或需兼容,改用短路判断:
const res = pm.response.json(); if (res && res.data && res.data.user) { ... } - 别依赖
console.log()输出结构就以为能直接取——控制台打印的是美化后的对象视图,实际脚本里访问的是原始数据结构
提取所有同名嵌套字段(如所有 pin)要用递归函数,不是 Object.values()
Object.values() 只展开第一层,对深层嵌套无效。例如从 {"PINS": {"2017": {"Nov-2017": {...}}}} 中取全部 pin 值,必须递归遍历:
function getAllValuesByKey(obj, key) {
const result = [];
for (const k in obj) {
if (obj.hasOwnProperty(k)) {
const val = obj[k];
if (k === key) result.push(val);
if (typeof val === 'object' && val !== null) {
result.push(...getAllValuesByKey(val, key));
}
}
}
return result;
}
const pins = getAllValuesByKey(pm.response.json(), 'pin');
console.log(pins); // ['6K3jP5vLyN', 'hnPKh7ywvT', ...]
- 这个函数不依赖路径深度,也不假设字段在哪一层,适合不确定结构的响应
- 注意加
obj.hasOwnProperty(k),否则可能误取原型链上的属性(比如toString) - 如果嵌套中混有数组,需额外判断
Array.isArray(val)并循环处理
提取后存变量要注意作用域和类型,别让后续请求用错
用 pm.environment.set('user_id', data.user.id) 存值时,常见问题不是取不到,而是:
- 存了
undefined却没检查:if (data?.user?.id) pm.environment.set('user_id', data.user.id) - 把数字存成字符串,后续在 Pre-request Script 里做数值计算时报错(比如
{{user_id}} + 1得到"1231"而非124) - 环境变量名含空格或特殊字符(如
user-id),导致引用时{{user-id}}解析失败——只允许字母、数字、下划线、短横线,且不能以数字开头
最易被忽略的一点:Postman 的 Tests 脚本执行时机在响应接收完成之后、但变量写入是异步生效的。如果你在同一个请求的 Tests 里设了变量,又立刻在下一个请求的 Pre-request Script 里读它,基本没问题;但若在集合 Runner 中跨请求依赖,务必确认前一个请求确实执行成功(HTTP 状态码、断言通过),否则变量可能是上一轮残留的旧值。

















