如何在Postman测试脚本中从嵌套且结构可变的JSON响应中提取对象/键名?
如何在Postman测试脚本中从嵌套且结构可变的JSON响应中提取对象/键名?
嘿,作为老派C++程序员刚转JSON、Postman这些确实有点绕,我来帮你捋捋问题出在哪以及怎么解决~
首先说你之前那段循环的问题:你用for (const _inner in _outer)的时候,_outer其实是外层的键名字符串(比如"input"),不是实际的对象。遍历字符串的话,拿到的只会是字符的索引(0、1、2...),自然取不到内层的value、identifierType这些真实键名。
正确的实现思路
核心是先拿到外层键对应的实际数组对象,再遍历数组里的内层对象键:
- 从第一个数据项里提取所有外层键(比如
input、output,不管后续会不会变成其他名字) - 对每个外层键,取出它对应的数组里的第一个对象(你的示例里每个数组只有一个元素,假设这个规律通用)
- 遍历内层对象的所有键,把外层键首字母大写后和内层键拼接成表头格式(比如
Input value) - 动态生成数据行,确保和表头的顺序对应
修正后的完整代码
function parseData(response) { const results = []; const headers = []; // 第一步:从第一个数据项提取表头 const firstItem = response[0]; for (const outerKey in firstItem) { // 拿到外层键对应的数组,取第一个内层对象 const innerObj = firstItem[outerKey][0]; // 遍历内层对象的键,生成格式化表头 for (const innerKey in innerObj) { // 外层键首字母大写,拼成"Input value"这种格式 const formattedOuter = outerKey.charAt(0).toUpperCase() + outerKey.slice(1); headers.push(`${formattedOuter} ${innerKey}`); } } // 第二步:生成所有数据行 response.forEach(item => { const row = []; for (const outerKey in item) { const innerObj = item[outerKey][0]; // 按表头的顺序提取对应值 for (const innerKey in innerObj) { row.push(innerObj[innerKey]); } } results.push(row); }); return [results, headers]; } // 调用示例:从响应中获取data数组并解析 const responseData = pm.response.json().data; const [tableRows, tableHeaders] = parseData(responseData); // 可选:用Postman可视化渲染表格 const visualizerTemplate = ` <table style="width:100%; border-collapse: collapse; margin-top:10px;"> <thead> <tr style="background-color:#f5f5f5;"> {{#each tableHeaders}} <th style="border:1px solid #ddd; padding:8px; text-align:left;">{{this}}</th> {{/each}} </tr> </thead> <tbody> {{#each tableRows}} <tr> {{#each this}} <td style="border:1px solid #ddd; padding:8px;">{{this}}</td> {{/each}} </tr> {{/each}} </tbody> </table> `; pm.visualizer.set(visualizerTemplate, { tableHeaders: tableHeaders, tableRows: tableRows });
代码说明
- 表头生成完全动态:不管外层键是
input/output还是其他名字,只要结构是「外层键对应数组,数组第一个元素是对象」,就能自动生成[外层键格式化] [内层键]的表头 - 数据行和表头严格对应:遍历顺序和表头生成时的顺序一致,不会出现列错位
- 适配可变结构:后续如果响应里的外层键、内层键变化,不需要修改代码,只要结构符合「外层是键值对,值为数组,数组元素是对象」就能正常工作
备注:内容来源于stack exchange,提问作者NULseg




