2016-08-12 280 views
3

我想提取addressId對於長數組響應的給定housenumber。陣列響應看起來像這樣(片斷):JMeter:正則表達式從數組響應中提取

: : "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個housenumbers在該響應作爲一個例子,但原始響應較大。

問:如何匹配adressId對於特定的houseNumber(我的CSV數據集中有這些houseNumbers)?我可以做一個正則表達式提取所有的addressId的,但是我不得不使用正確的匹配號。在Jmeter。但是,我不能認爲這些東西的定型在我們測試腳本的不同環境中會保持不變。

+1

像這樣[''addressId「:」(\ d +)「(?=(?:(?!\ n:+:[\] [\ s \ S])* houseNumber」:「26 | $ )'](https://regex101.com/r/kL9xQ8/1)? –

+0

謝謝,這工作! – DMC

+1

它在JMeter中也有效嗎?剛纔我發現前瞻是多餘的。 –

回答

3

我會推薦重新考慮使用正則表達式來處理JSON數據。

從JMeter 3.0開始,你有一個JSON Path PostProcessor。使用它可以執行任意JSONPath查詢,以提取addressID對於給定houseNumber將簡單:

`$..[?(@.houseNumber == '25')].addressId` 

演示:

JSON Path Demo

您可以使用JMeter的變量,而不是硬的-coded 25值,如:

$..[?(@.houseNumber == '${houseNumber}')].addressId 

如果由於某種原因,你必須使用JMeter的< 3.0,您仍可通過JMeter Plugins

有使用JSON Path Extractor JSON路徑後處理功能見Advanced Usage of the JSON Path Extractor in JMeter的文章,特別是條件選擇章以獲取更多信息。

+0

如果[你的答案之一](http://stackoverflow.com/search?q=user%3A2897748+%5Bjmeter%5D+JSON)旁邊是相同的,也許你應該把這個問題作爲一個愚蠢的關閉? –

2

,如果你使用你可以使用正則表達式addressId之後和在特定houseNumber,將捕獲的數字的展開回火貪婪令牌(爲了提高效率)在它們之間,以確保正則表達式引擎不會溢出到其他記錄。

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

regex demo(必要的門牌號碼更換25

詳細

  • "addressId":" - 文字字符串
  • (\d+) - 第1組($1$模板值)拍攝1+ digits
  • " - 報價
  • (?:[^\n"]*(?:\n(?!: +: +\[)[^\n"]*|"(?!houseNumber")[^\n"]*)*"houseNumber":"25"|$) - 與2層的替代方案,一個是$(串的端部),或一個非捕獲組: - 零個或多個字符以外換行符和"
  • (?:
    • [^\n"]* - 然後來兩個備選方案:
      • \n(?!: +: +\[)[^\n"]* - 一個換行符不跟: : [像字符串,然後跟0 +字符而不是一個換行符和"
      • | - 或
      • "(?!houseNumber")[^\n"]* - 一個"後面沒有與houseNumber和隨後用0 +以外換行符和字符"
    • )* - 比可以重複0次或多次
  • "houseNumber":"25" - 數字字符串。