邮递员从JSON获取值,其中使用JavaScript等于数组中的值

时间:2019-02-27 09:20:33

标签: javascript arrays json postman

当前使用的最新版本的Postman:6.7.4(最新)

我正在尝试从JSON响应主体中获取一个值并将其存储在环境变量中,但值'username'应该等于我的首选用户名。

通常我会提取一个像这样的值:

var jsonData = pm.response.json();
pm.environment.set("useridToken", jsonData.Customers[0].userid);

这会给我列表中的第一项,但我希望从列表中获得第一项或第二项。例如,我希望获得userid 其中 username 等于“比利”。

身体反应的输出:

{
"Customers": [
    {
        "id": 24,
        "userid": 73063,
        "username": "BOB",
        "firstname": "BOB",
        "lastname": "LASTNAME
    },
    {
        "id": 25,
        "userid": 73139,
        "username": "Billy",
        "firstname": "Billy",
        "lastname": "lasty"
    }
   ]
}

有什么提示吗?

我记得在SoapUI中是这样的:

$.channels[?(@.is_archived=='false')].id[0]

我想在邮递员的JS中不可能做到这一点?

9 个答案:

答案 0 :(得分:4)

您可以使用:Array.prototype.find()

const data = {
  "Customers": [{
      "id": 24,
      "userid": 73063,
      "username": "BOB",
      "firstname": "BOB",
      "lastname": "LASTNAME"
    },
    {
      "id": 25,
      "userid": 73139,
      "username": "Billy",
      "firstname": "Billy",
      "lastname": "lasty"
    }
  ]
};

const user = data.Customers.find(u => u.username === 'Billy');
const userid = user ? user.userid : 'not found';

console.log(user);
console.log(userid);

答案 1 :(得分:3)

在Postnam测试脚本中,您可以使用some Javascript功能。就您而言,有太多的方法可以做。 我将向您展示如何使用Array.find函数解决您的情况:

var jsonData = pm.response.json();
var user = jsonData.Customers.find(function(user) {
    return user.username === 'Billy';
    // OR you could config username in postman env
    // return user.username === pm.variables.get("username_to_find"); 
});
pm.environment.set("useridToken", user.userid);

答案 2 :(得分:2)

find()是这里的最佳解决方案,但是,如果用户名不是唯一的,并且您想要一系列用户名为“ Billy”的用户,则使用filter()

const jsonData = {
  "Customers": [{
      "id": 24,
      "userid": 73063,
      "username": "BOB",
      "firstname": "BOB",
      "lastname": "LASTNAME"
    },
    {
      "id": 25,
      "userid": 73139,
      "username": "Billy",
      "firstname": "Billy",
      "lastname": "lasty"
    }
  ]
}
console.log(jsonData.Customers.filter(c => c.username === 'Billy'))

答案 3 :(得分:1)

您也可以使用userid来获取您的filter,如下所示-

const data = {
  "Customers": [{
      "id": 24,
      "userid": 73063,
      "username": "BOB",
      "firstname": "BOB",
      "lastname": "LASTNAME"
    },
    {
      "id": 25,
      "userid": 73139,
      "username": "Billy",
      "firstname": "Billy",
      "lastname": "lasty"
    }
  ]
};
const username = 'Billy';
const user = data.Customers.filter(obj => obj.username.toLowerCase() === username.toLowerCase())[0];
const userid = user ? user['userid'] : null;

console.log(userid);

注意:.toLowerCase()在此处是可选的,您可以根据自己的情况使用它。

然后您只需将其设置为-

pm.environment.set("useridToken", userid);

答案 4 :(得分:1)

您还可以使用Lodash遍历数据并设置该值:

_.each(pm.response.json().Customers, (item) => {
    if (item.username === "Billy") {
        pm.globals.set('username', item.username)
    }
})

答案 5 :(得分:0)

尝试

const userid = data.Customers.find(u => u.username === 'Billy') || 'not found';

答案 6 :(得分:0)

重复 the currently highest voted answer, 稍作修改。
还添加了一个受启发的解决方案 the other Lodash answer.1

const jsonData = {
  Customers: [{
    id: 24,
    userid: 73063,
    username: 'BOB',
    firstname: 'BOB',
    lastname: 'LASTNAME'
  }, {
    id: 25,
    userid: 73139,
    username: 'Billy',
    firstname: 'Billy',
    lastname: 'lasty'
  }]};
for (const i in jsonData.Customers) {
  console.log('userid of customer['+i+']: '+jsonData.Customers[i].userid);
}
const userId_UsingFind = (name) => {
  const user = jsonData.Customers.find(item => item.username === name);
  return user ? user.userid : user;
};
console.log('Using .find(), userid of "Billy": '+userId_UsingFind('Billy'));
console.log('Using .find(), userid of "Joe": '+userId_UsingFind('Joe'));

const userId_Native = (name) => {
  for (const i in jsonData.Customers) {
    if (jsonData.Customers[i].username === name) {
      return jsonData.Customers[i].userid;
    }
  }
};
console.log('Native loop, userid of "Billy": '+userId_Native('Billy'));
console.log('Native loop, userid of "Joe": '+userId_Native('Joe'));

如代码所示,使用 .find() 的解决方案既简短又优雅。


1 假设期望的结果是 firstuserid Billy。为所有出现检索userid:s的数组 Billy,请参阅 answer that returns an array of userid:s

答案 7 :(得分:0)

这个答案展示了一个使用 JavaScript 库的解决方案 Lodash
不是意味着作为建议,而只是为了证明它是 可能使用 Lodash。
它的灵感来自 the other lodash answer.1

const jsonData = {
  Customers: [{
    id: 24,
    userid: 73063,
    username: 'BOB',
    firstname: 'BOB',
    lastname: 'LASTNAME'
  }, {
    id: 25,
    userid: 73139,
    username: 'Billy',
    firstname: 'Billy',
    lastname: 'lasty'
  }]
};

const userId_Lodash = (name) => {
  let userId;
  _.forEach(jsonData.Customers, (item) => {
    if (item.username === name) { userId = item.userid; }
  });
  return userId;
};
console.log('Lodash loop, userid of "Billy": ' + userId_Lodash('Billy'));
console.log('Lodash loop, userid of "Dave": ' + userId_Lodash('Dave'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.19/lodash.js"></script>

对于手头的问题,我没有看到使用 Lodash 的任何特别理由 图书馆。
但在其他例子中,它可能更有意义。


1 发布的问题没有说明期望的结果是否是 first userid 匹配 Billy,或所有这样的用户 ID:s。 这个答案给出了第一次命中。

答案 8 :(得分:0)

这个答案的灵感来自 other answer that outputs an array1

原发帖者没有明确说明是否需要输出 应该是 single userid (大概是第一次出现?) - 或者 一个包含 all userid:s 匹配“Billy”的数组。

这个答案显示了通过使用后一种情况的解决方案 Lodash

const jsonData = {
  Customers: [{
    userid: 73063,
    username: 'BOB'
  }, {
    userid: 73138,
    username: 'Billy'
  }, {
    userid: 74139,
    username: 'Billy'
  }]
};

const userIds = [];
_.forEach(_.filter(jsonData.Customers, c => c.username === 'Billy'),
  item => { userIds.push(item.userid); });
console.log(userIds);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.19/lodash.js"></script>

1 这个答案很有帮助,因为它暗示了如何过滤掉 Customers 数组的相关对象。然而,原来的海报 想要(一个数组)userid(s),它是一个数字,而不是一个数组 包含 userid:s 的对象。这就是我在这里的答案 不一样。