当前使用的最新版本的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中不可能做到这一点?
答案 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 假设期望的结果是 first 的 userid
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 array。 1
原发帖者没有明确说明是否需要输出
应该是 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 的对象。这就是我在这里的答案
不一样。