正则表达式JSON响应加特林压力工具

时间:2014-09-15 18:49:29

标签: regex json scala http gatling

想要在http响应中捕获名为scanNumber的变量,如下所示:

{"resultCode":"SUCCESS","errorCode":null,"errorMessage":null,"profile":{"fullName":"TestFirstName TestMiddleName TestLastName","memberships":[{"name":"UA Gold Partner","number":"123-456-123-123","scanNumber":"123-456-123-123"}]}}

如何定期进行此操作? 我使用的工具是Gatling压力工具(使用Scala DSL)

我试过这样做:

.check(jsonPath("""${scanNumber}""").saveAs("scanNr")))

但我收到错误:

---- Errors --------------------------------------------------------------------
> Check extractor resolution crashed: No attribute named 'scanNu      5 (100,0%)
mber' is defined

3 个答案:

答案 0 :(得分:3)

你第一次接近。

你真正想要的是:

.check(jsonPath("""$..scanNumber""").saveAs("scanNr")))

或可能:

.check(jsonPath("""$.profile.memberships[0].scanNumber""").saveAs("scanNr")))

请注意,这使用jsonPath,而不是正则表达式。 JsonPath应该比regex更可靠。

查看JsonPath spec以获取更多高级用法。

答案 1 :(得分:0)

使用此正则表达式在json中的任何位置匹配:

/"scanNumber":"[^"]+"/

如果你想匹配只是在你说使用的结构中发生:

/\{[^{[]+\{[^{[]+\[\{[^{[]*("scanNumber":"[^"]+")/

答案 2 :(得分:0)

由于json字段可能会更改其顺序,因此您应该使正则表达式更容忍这些更改:

val j = """{"resultCode":"SUCCESS","errorCode":null,"errorMessage":null,"profile":{"fullName":"TestFirstName TestMiddleName TestLastName","memberships":[{"name":"UA Gold Partner","number":"123-456-123-123","scanNumber":"123-456-123-123"}]}}"""
val scanNumberRegx = """\{.*"memberships":\[\{.*"scanNumber":"([^"]*)".*""".r
val scanNumberRegx(scanNumber) = j

scanNumber //String = 123-456-123-123

即使json字段的顺序不同(但当然保留结构)

,这也会有效