Gatling:JsonPath提取多个值

时间:2015-01-28 15:06:48

标签: json scala jsonpath gatling

我正在建立一个加密的2.1.3场景,我需要从json体中提取数据。

身体的例子:

[
  {
    "objectId": "FirstFoo",
    "pvrId": "413"
    "type": "foo",
    "name": "the first name",
    "fooabilities": {
      "foo1": true,
      "foo2": true
    },
    "versions": [23, 23, 23, 23, 23, 23, 24, 23, 23],
    "logo": [
      {
        "type": "firstlogo",
        "width": 780,
        "height": 490,
        "url": "firstlogos/HD/{resolution}.png"
      }
    ]
  },
  {
    "objectId": "SecondFoo",
    "pvrId": "414"
    "type": "foo",
    "name": "the second name",
    "fooabilities": {
      "foo1": true,
      "foo2": false
    },
    "versions": [23, 23, 23, 23, 23, 23, 24, 23, 23],
    "logo": [
      {
        "type": "secondlogo",
        "width": 780,
        "height": 490,
        "url": "secondlogos/HD/{resolution}.png"
      }
    ]
  }
]

我有这个代码试图提取de数据:

exec(
  http("get object")
    .get(commons.base_url_ws + "/my-resource/2.0/object/")
    .headers(commons.headers_ws_session).asJSON
    .check(jsonPath("$..*").findAll.saveAs("MY_RESULT"))) (1)
  .exec(session => {
    foreach("${MY_RESULT}", "result") { (2)
      exec(session => {
        val result= session("result").as[Map[String, Any]]
        val objectId = result("objectId")
        val version = result("version") 
        session.set("MY_RESULT_INFO", session("MY_RESULT_INFO").as[List[(String,Int)]] :+ Tuple2(objectId, version))
      })
    }
    session
  })

我的目标是: 从版本数组中提取objectId和第9个值。 我希望它看起来像Vector - >会话中的[(id1,version1),(id2,version2)]稍后在另一次API调用中重用。

我担心的是: (1)这是否会在完整子对象的会话中创建条目?因为在其他答案中,我总是保存一张地图(" id" = [{...}]),这里我没有ids。

(2)在日志中,我看到会话加载了大量数据,但是这个foreach从未被调用过。什么可能导致这种情况?

我在Scala的经历是一个初学者,所以请指出我是否有明确的问题,我没有看到。

我已经研究过这个问题:Gatling - Looping through JSON array并没有完全回答我的问题。

非常感谢!

1 个答案:

答案 0 :(得分:0)

我找到了一种用正则表达式做的方法。

.check(regex("""(?:"objectId"|"version"):"(.*?)",.*?(?:"objectId"|"version"):\[(?:.*?,){9}([0-9]*?),.*?\]""").ofType[(String, String)].findAll saveAs ("OBJECTS")))

然后我可以使用这个

foreach("${OBJECTS}", "object") {
  exec(
    http("Next API call")
      .get(commons.base_url_ws + "/my-resource/2.0/foo/${object._1}/${object._2}")
    [...]
}