JMeter:从数组响应中提取正则表达式

时间:2016-08-12 10:53:30

标签: regex api jmeter

我想在具有长数组的响应中为给定的housenumber提取 addressId 。数组响应看起来像这样(片段):

:   :   "footprint":null,
:   :   "type":null,
:   :   "addressId":"0011442239",
:   :   "streetName":"solitudestr.",
:   :   "streetNrFirstSuffix":null,
:   :   "streetNrFirst":null,
:   :   "streetNrLastSuffix":null,
:   :   "streetNrLast":null,
:   :   "houseNumber":"25",
:   :   "houseName":null,
:   :   "city":"stuttgart",
:   :   "postcode":"70499",
:   :   "stateOrProvince":null,
:   :   "countryName":null,
:   :   "poBoxNr":null,
:   :   "poBoxType":null,
:   :   "attention":null,
:   :   "geographicAreas":
:   :   [
:   :   ],
:   :   "firstName":null,
:   :   "lastName":null,
:   :   "title":null,
:   :   "region":"BW",
:   :   "additionalInfo":null,
:   :   "properties":
:   :   [
:   :   ],
:   :   "extAddressId":null,
:   :   "entrance":null,
:   :   "district":null,
:   :   "addressLine1":null,
:   :   "addressLine2":null,
:   :   "addressLine3":null,
:   :   "addressLine4":null,
:   :   "companyName":null,
:   :   "contactName":null,
:   :   "houseNrExt":null,
:   :   "derbyStack":false
:   },
:   {
:   :   "footprint":null,
:   :   "type":null,
:   :   "addressId":"0011442246",
:   :   "streetName":"solitudestr.",
:   :   "streetNrFirstSuffix":null,
:   :   "streetNrFirst":null,
:   :   "streetNrLastSuffix":null,
:   :   "streetNrLast":null,
:   :   "houseNumber":"26",
:   :   "houseName":null,
:   :   "city":"stuttgart",
:   :   "postcode":"70499",
:   :   "stateOrProvince":null,
:   :   "countryName":null,
:   :   "poBoxNr":null,
:   :   "poBoxType":null,
:   :   "attention":null,
:   :   "geographicAreas":
:   :   [
:   :   ],
:   :   "firstName":null,
:   :   "lastName":null,
:   :   "title":null,
:   :   "region":"BW",
:   :   "additionalInfo":null,
:   :   "properties":
:   :   [
:   :   ],
:   :   "extAddressId":null,
:   :   "entrance":null,
:   :   "district":null,
:   :   "addressLine1":null,
:   :   "addressLine2":null,
:   :   "addressLine3":null,
:   :   "addressLine4":null,
:   :   "companyName":null,
:   :   "contactName":null,
:   :   "houseNrExt":null,
:   :   "derbyStack":false
:   },

我只在这个回复中显示2个住宅号作为示例,但原始响应更大。

问:我如何匹配特定houseNumber的 adressId (我的CSV数据集中有这些houseNumbers)?我可以做一个正则表达式,它提取所有addressId'但我必须使用正确的匹配号。在Jmeter。但是,我不能假设在我们测试脚本的不同环境中,这些的结构将保持相同。

2 个答案:

答案 0 :(得分:3)

我建议重新考虑使用正则表达式来处理JSON数据。

从JMeter 3.0开始,您有一个JSON Path PostProcessor。使用它,您可以执行任意JSONPath个查询,因此提取给定addressID的{​​{1}}将非常简单:

houseNumber

演示:

JSON Path Demo

您可以使用JMeter变量而不是硬编码的`$..[?(@.houseNumber == '25')].addressId` 值,如:

25

如果由于某种原因你必须使用JMeter< 3.0您仍然可以通过JSON Path Extractor

使用JMeter Plugins获得JSON Path后处理功能

有关详细信息,请参阅Advanced Usage of the JSON Path Extractor in JMeter文章,特别是条件选择一章。

答案 1 :(得分:2)

如果您使用展开的驯化贪婪令牌(为了更好的效率),您可以使用在addressId之后和特定houseNumber之前捕获数字的正则表达式它们是为了确保正则表达式引擎不会溢出到另一条记录。

"addressId":"(\d+)"(?:[^\n"]*(?:\n(?!: +: +\[)[^\n"]*|"(?!houseNumber")[^\n"]*)*"houseNumber":"25"|$)

请参阅regex demo(将25替换为必要的门牌号码)

<强>详情:

  • "addressId":" - 文字字符串
  • (\d+) - 第1组($1$模板值)捕获1+位数
  • " - 引用
  • (?:[^\n"]*(?:\n(?!: +: +\[)[^\n"]*|"(?!houseNumber")[^\n"]*)*"houseNumber":"25"|$) - 一个非捕获组,有2个替代,一个是$(字符串结束)或:
    • [^\n"]* - 除了换行符和"
    • 之外的零个或多个字符
    • (?: - 然后有两个选择:
      • \n(?!: +: +\[)[^\n"]* - 换行符后跟: : [字符串后面跟着0 +字符,而不是换行符"
      • | - 或
      • "(?!houseNumber")[^\n"]* - "未跟houseNumber后跟0 +字符而非换行符"
    • )* - 可能重复0次或更多次
  • "houseNumber":"25" - hourse number literal string。