如何使用JavaScript从复杂JSON对象提取值以验证REST响应
问题:从REST服务响应中提取嵌套字段用于验证
原始REST响应格式
{ "data": [ { "A9001001A23D10A943E48481": { "id": "A9001001A23D10A943E48481", "type": "WIP", "status": "ERROR", "message": "could not move document", "details": [ "No document found with document id 'A9001001A23D10A943E48481'" ] } }, { "A9001001A23D10A945468483": { "id": "A9001001A23D10A945468483", "type": "WIP", "status": "ERROR", "message": "could not move document", "details": [ "No document found with document id 'A9001001A23D10A945468483'" ] } } ], "error": {} }
需求
已知文档id,需要提取每个文档的id、type、status、message、details字段值,与预期值对比验证。目前可获取data数组中的单个对象(如data[0]、data[1]),但无法访问其下层嵌套数据,曾尝试用Map处理但未成功:
let myMap = new Map(Object.entries(jsonData.data[0]));
解决方案
1. 直接提取单个文档的嵌套数据
每个data数组元素仅包含一个以文档id为键的对象,可通过Object.keys()获取该键,进而访问嵌套字段:
// 获取第一个文档对象 const firstItem = jsonData.data[0]; // 提取文档id(唯一键) const docId = Object.keys(firstItem)[0]; // 获取完整的文档数据 const docData = firstItem[docId]; // 访问需要验证的字段 console.log(docData.id); // 输出:A9001001A23D10A943E48481 console.log(docData.type); // 输出:WIP console.log(docData.status); // 输出:ERROR console.log(docData.message); // 输出:could not move document console.log(docData.details[0]);// 输出:No document found with document id 'A9001001A23D10A943E48481'
2. 遍历所有文档批量验证
如果需要处理data数组中的所有文档,可结合forEach循环批量提取和验证:
jsonData.data.forEach(item => { const docId = Object.keys(item)[0]; const docData = item[docId]; // 示例验证逻辑 if (docData.type !== "WIP") { console.error(`文档${docId}的type字段不符合预期`); } if (docData.status !== "ERROR") { console.error(`文档${docId}的status字段不符合预期`); } // 其他字段验证可依此类推 });
3. 正确使用Map处理的方式
如果坚持用Map,需通过values()或get()方法获取嵌套对象,而非直接使用Map实例:
const myMap = new Map(Object.entries(jsonData.data[0])); // 方法1:通过values()获取唯一值 const docData1 = myMap.values().next().value; // 方法2:已知id的情况下直接get const docData2 = myMap.get("A9001001A23D10A943E48481"); // 访问字段 console.log(docData1.id);
内容的提问来源于stack exchange,提问作者Alice McKernon
相关产品推荐
相关产品推荐

