首页 > 解决方案 > 在 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');

对于这种情况。

标签: jsonpostmanlodash

解决方案


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 不支持fetchand XMLHttpRequest,所以可以将 jsonpath.min.js 文件内容保存在环境变量中,然后eval(pm.environment.get('jsonpath'));在使用前按照 https://community.getpostman.com/t/adding-external-libraries-to-中的说明进行使用邮递员/1971/4


推荐阅读