Postman测试中_.find查找JSON嵌套属性失效问题求助
Postman使用_.find匹配嵌套对象属性的实现方案
在Postman测试脚本中使用Lodash的_.find函数匹配接口响应结果并保存环境变量时,匹配JSON顶层属性(如name字段)可正常运行,但无法实现嵌套对象内部属性的匹配查找。
接口返回结构
接口返回的JSON payload结构如下:
[ { "name": "product1", "state": { "DefinitionId": "productcard", "Id": "32919b8c-984e-46c3-933d-51d3c621d4cf" }, "status": "Done" }, { "name": "product2", "state": { "DefinitionId": "productaccount", "Id": "4999b8c-984e-46c3-933d-55d3c621d4cf" }, "status": "NotDone" } ]
现有可用的顶层匹配代码
目前通过顶层name字段查找的可正常运行代码如下:
var steps = _.find(resBody, { name: "product1", }) pm.environment.set(steps.name, steps.state.Id);
问题描述
需要改用嵌套在state对象下的DefinitionId字段作为匹配条件,尝试两种写法均未生效:
- 第一种直接将嵌套路径作为匹配键,无匹配结果
- 第二种直接遍历
resBody.state,返回[object Object]异常,无法得到正确结果
尝试的错误写法如下:
// 错误写法1:直接将点路径作为对象键,语法不支持 _.find(resBody, { name.state: "product1", }) // 错误写法2:遍历路径错误,resBody为数组无直接state属性 _.find(resBody.state, { name.state: "product1", })
正确实现方式
_.find支持两种写法实现嵌套属性匹配,可根据场景选择:
方案1:嵌套对象匹配简写(与原有写法风格一致)
直接在匹配条件中写入嵌套对象的对应结构即可,Lodash会自动执行深度部分匹配,无需列出嵌套对象下的所有字段:
// 匹配state.DefinitionId为目标值的数组项 var steps = _.find(resBody, { state: { DefinitionId: "productcard" } }) // 增加空值判断,避免无匹配结果时访问属性报错 if (steps) { pm.environment.set(steps.name, steps.state.Id); }
方案2:自定义回调函数(灵活度更高)
如果需要叠加多条件、或者实现更复杂的判断逻辑,可传入自定义回调函数编写匹配规则:
var steps = _.find(resBody, function(item) { // 可自由编写判断逻辑,支持多条件组合 return item.state.DefinitionId === "productcard" && item.status === "Done" }) if (steps) { pm.environment.set(steps.name, steps.state.Id); }
错误原因说明
- 第一种写法错误:JavaScript对象键不支持直接写
a.b格式的点路径,且Lodash默认的对象匹配规则也不识别点路径字符串的嵌套匹配写法 - 第二种写法错误:
resBody是对象数组,本身不存在state属性,直接访问resBody.state会得到undefined,遍历undefined自然会触发类型异常
内容的提问来源于stack exchange,提问作者Dymond
相关产品推荐
相关产品推荐

