json - 在 Postman 中使用 JS Lodash 提取嵌套的 JSON 数组响应对象
问题描述
我想学习如何使用 Lodash 从 JSON 响应中提取变量,因为在其他 Postman 问题中解释的传统方法并没有像我以前在 Jmeter 中使用 json 路径那样解释执行此操作的简单方法。
我需要将以下 json 路径转换为 Lodash 表达式,该表达式返回与此 JSON 路径相同的值
1. FlightSegmentsItinerary[*].Flights[*].Key
2. $..Flights[*].Key
3. Travelers[*].[?(@.TypeCode == "INF")].FirstName (returns the name of the passangers whose type code are == "INF")
JSON响应:
{
"Travelers": [
{
"TypeCode": "ADT",
"FirstName": "FULANO",
"Surname": "LAZARO",
"Key": "1.1"
},
{
"TypeCode": "INF",
"FirstName": "MENGANO",
"Surname": "XULO",
"Key": "2.2"
}
],
"FlightSegmentsItinerary": [
{
"Flights": [
{
"Key": "1"
},
{
"Key": "2"
}
]
}
]
}
到目前为止,我能够使用以下方法提取旅行者密钥 (Travelers[*].Key):
var jsonData = pm.response.json();
var travelerKeys = _.map(jsonData.Travelers, 'Key');
console.log("travelerKeys: " + travelerKeys);
Output: travelerKeys: 1.1,2.2
如您所见,JSON 路径:
旅行者[*].Key
在 Lodash 中看起来像这样:
var travelerKeys = _.map(jsonData.Travelers, 'Key');
对于这种情况。
解决方案
var jsonData = {
"Travelers": [{
"TypeCode": "ADT",
"FirstName": "FULANO",
"Surname": "LAZARO",
"Key": "1.1"
},
{
"TypeCode": "INF",
"FirstName": "MENGANO",
"Surname": "XULO",
"Key": "2.2"
}
],
"FlightSegmentsItinerary": [{
"Flights": [{
"Key": "1"
},
{
"Key": "2"
}
]
}]
}
// 1. FlightSegmentsItinerary[*].Flights[*].Key
console.log( _(jsonData.FlightSegmentsItinerary).flatMap('Flights').map('Key') )
//2. $..Flights[*].Key
console.log( _.chain(jsonData).values().flatten().find('Flights').values().flatten().map('Key') )
//3. Travelers[*].[?(@.TypeCode == "INF")].FirstName (returns the name of the passangers whose type code are == "INF")
console.log( _(jsonData.Travelers).filter(['TypeCode', 'INF']).map('FirstName') )
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
另一种选择可能是尝试 JavaScript 库,例如https://github.com/dchester/jsonpath
var jsonData = {
"Travelers": [{
"TypeCode": "ADT",
"FirstName": "FULANO",
"Surname": "LAZARO",
"Key": "1.1"
},
{
"TypeCode": "INF",
"FirstName": "MENGANO",
"Surname": "XULO",
"Key": "2.2"
}
],
"FlightSegmentsItinerary": [{
"Flights": [{
"Key": "1"
},
{
"Key": "2"
}
]
}]
}
console.log(jsonpath.query(jsonData, '$.FlightSegmentsItinerary[*].Flights[*].Key'))
console.log(jsonpath.query(jsonData, '$..Flights[*].Key'))
console.log(jsonpath.query(jsonData, '$.Travelers..[?(@.TypeCode == "INF")].FirstName'))
<script src="https://cdn.jsdelivr.net/npm/jsonpath@1.0.2/jsonpath.min.js"></script>
由于 Postman 不支持fetch
and XMLHttpRequest
,所以可以将 jsonpath.min.js 文件内容保存在环境变量中,然后eval(pm.environment.get('jsonpath'));
在使用前按照
https://community.getpostman.com/t/adding-external-libraries-to-中的说明进行使用邮递员/1971/4