You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Postman测试脚本中从嵌套且结构可变的JSON响应中提取对象/键名?

如何在Postman测试脚本中从嵌套且结构可变的JSON响应中提取对象/键名?

嘿,作为老派C++程序员刚转JSON、Postman这些确实有点绕,我来帮你捋捋问题出在哪以及怎么解决~

首先说你之前那段循环的问题:你用for (const _inner in _outer)的时候,_outer其实是外层的键名字符串(比如"input"),不是实际的对象。遍历字符串的话,拿到的只会是字符的索引(0、1、2...),自然取不到内层的valueidentifierType这些真实键名。

正确的实现思路

核心是先拿到外层键对应的实际数组对象,再遍历数组里的内层对象键:

  1. 从第一个数据项里提取所有外层键(比如inputoutput,不管后续会不会变成其他名字)
  2. 对每个外层键,取出它对应的数组里的第一个对象(你的示例里每个数组只有一个元素,假设这个规律通用)
  3. 遍历内层对象的所有键,把外层键首字母大写后和内层键拼接成表头格式(比如Input value
  4. 动态生成数据行,确保和表头的顺序对应

修正后的完整代码

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

火山引擎 最新活动