You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 10:30:35