Gatling :从 JSON 中获取特定值的条件

Posted

技术标签:

【中文标题】Gatling :从 JSON 中获取特定值的条件【英文标题】:Gatling : condition to get a specific value from a JSON 【发布时间】:2022-01-22 19:50:00 【问题描述】:

我是 Gatling 新手,在这方面有点挣扎。

我有这个来自 html 的 JSON 对象:

<div id="DATA--DECL-DATA">"isCompany":false,"accommodations":["id":"00000000031000000067","isChecked":false,"name":"5 JULI 2017","addressLine1":"STRAAT 10 ","addressLine2":"1000 New York","nightsDeclared":0,"schoolNightsDeclared":0,"schoolNightsAttached":0,"taxableNights":0.0,"totalPayment":0.0,"isInProgress":false,"isLate":false,"isPayed":"false","deadline":"2021-12-31","initialAmount":0.0,"remainingAmount":0.0,"id":"00000000031000006362","isChecked":false,"name":"BELLEVIE","addressLine1":"STRAAT 10 ","addressLine2":"1000 New York","isInProgress":false,"id":"00000000031000006380","isChecked":false,"name":"BELLEVIE","addressLine1":"STRAAT 10 ","addressLine2":"1000 New York","isInProgress":true,"id":"00000000031000006390","isChecked":false,"name":"BELLEVIE","addressLine1":"STRAAT 10 ","addressLine2":"1000 New York","isInProgress":true]</div>

如果美化了,渲染这个:


  "isCompany": false,
  "accommodations": [
    
      "id": "00000000031000000067",
      "isChecked": false,
      "name": "5 JULI 2017",
      "addressLine1": "STRAAT 10 ",
      "addressLine2": "1000 New York",
      "isInProgress": false
    ,
    
      "id": "00000000031000006362",
      "isChecked": false,
      "name": "BELLEVIE",
      "addressLine1": "STRAAT 10 ",
      "addressLine2": "1000 New York"
      "isInProgress": false
    ,
    
      "id": "00000000031000006380",
      "isChecked": false,
      "name": "BELLEVIE",
      "addressLine1": "STRAAT 10 ",
      "addressLine2": "1000 New York",
      "isInProgress": true
    ,
    
      "id": "00000000031000006390",
      "isChecked": false,
      "name": "BELLEVIE",
      "addressLine1": "STRAAT 10 ",
      "addressLine2": "1000 New York",
      "isInProgress": true
    
  ]

为了从那个 div 中获取这个 JSON 数组并将其保存到 Gatling 中的会话变量中,我写了这个“检查”:

.check(css("div#DATA--DECL-DATA").saveAs("myJsonObj"))

然后在脚本执行后在控制台中打印结果,我写了这个:

.exec  session => println("json = " + session("myJsonObj").as[String]); session .exitHereIfFailed

这将在控制台中打印出您在上面看到的完整的美化 JSON 数组。


现在,在那个住宿 JSON 数组中,我们可以看到当 "isInProgress" 为 false 时有多个 id

那么我的问题是,当 "isInProgress" 为假时,如何获取住宿的第一个 id

所以:如果 "IsInProgress" 为 false => 获取该数组中的第一个住宿 id。

【问题讨论】:

您尝试过哪些解决方案,哪些不起作用? 我首先尝试使用正则表达式获取该数组中的住宿 id,它起作用了,.check(regex(""""accommodations":[\"id":"(.*? )"""").saveAs("accommodationId"))。但是,它总是会呈现第一个住宿 id。当“isInProgress”为假时,目标是能够在该 json 数组中获得第一个住宿。因此,每次在表单中提交一个 id 并将“isInProgress”变为“true”时,它将获得一个“isInProgress”为“false”的现有 id。 【参考方案1】:

以下代码是用 javascript 编写的,但应该很容易转换为 scala。

var json = 
  "isCompany": false,
  "accommodations": [
    
      "id": "00000000031000000067",
      "isChecked": false,
      "name": "5 JULI 2017",
      "addressLine1": "STRAAT 10 ",
      "addressLine2": "1000 New York",
      "isInProgress": false
    ,
    
      "id": "00000000031000006362",
      "isChecked": false,
      "name": "BELLEVIE",
      "addressLine1": "STRAAT 10 ",
      "addressLine2": "1000 New York",
      "isInProgress": false
    ,
    
      "id": "00000000031000006380",
      "isChecked": false,
      "name": "BELLEVIE",
      "addressLine1": "STRAAT 10 ",
      "addressLine2": "1000 New York",
      "isInProgress": true
    ,
    
      "id": "00000000031000006390",
      "isChecked": false,
      "name": "BELLEVIE",
      "addressLine1": "STRAAT 10 ",
      "addressLine2": "1000 New York",
      "isInProgress": true
    
  ]


var FilteredJson = json.accommodations.filter((value) => if (value.isInProgress === false) return value);

//just take the first value of FilteredJson

console.log(FilteredJson[0]);

【讨论】:

【参考方案2】:

根据我之前的answer,您需要check 带有条件的json-path:

.check(jsonPath("$.accommodations[?(@.isInProgress==false)].id").find.saveAs("id"))

解释:

@.isInProgress==false - 这是数组accommodations 中每个对象的条件。 更多关于 json-path 的细节可以查看here

Gatling 的方法find 返回第一个匹配项。还存在返回所有值的方法findAll...

【讨论】:

您错过了“我有这个来自 HTML 的 JSON 对象”。如果此信息正确,则负载不是 JSON,您不能使用 jsonPath 或 jmesPath。 @StéphaneLANDELLE 是的,但在另一个问题中,我回答了如何仅使用 json 进行转换工作***.com/a/70436671/7512201 我看到了你的答案,但我认为没有必要使用杰克逊......

以上是关于Gatling :从 JSON 中获取特定值的条件的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSON 从 API 中提取特定值的问题

当我只想获取字典中的特定值时,如何解码字典值的 JSON 数组?

从 NSDictionary 中按键获取具有特定值的对象

Gatling:从 HTML 表单中获取信息

Gatling Feeder - 从列表中获取信息

获取具有特定数量的重复值的行