jsonPath - 如何通过匹配子字符串来过滤结果

jsonPath - how to filter results by matching substring

我有这样的结构:

{"payload": {

    "Item1": {
      "property1": "Sunday",
      "property2": "suffering_8890"
    },

    "Item2": {
      "property1": "Monday",
      "property2": "misery_0776"
    },

    "Item3": {
      "property1": "Tuesday",
      "property2": "pain_6756"
    }
  }
}

我需要包含特定子字符串(即 "misery")的 property2 值。最终我只需要 4 位代码,但即使获得完整值也可以。我可以使用以下方法获取所有 property2 值的列表:

$..property2

这个returns:

Result[0] = suffering_8890
Result[1] = misery_0776
Result[2] = pain_6756

如何过滤它,以便它只提供包含子字符串 "misery" 的结果?

对于上述场景,您也可以使用 regular expression extractor 来获取如下所示的四位数

property2": "misery_(.*)"

这将帮助您立即将四位代码保存在 JMeter 变量中。如果您坚持要使用 jsonpath 从 JSON 中找出所需的值,您可以使用 JSON 过滤器,如下所示:-

$..[?(@.property2.indexOf('misery')>=0)]..property2

关于完整值,您可以使用 Filter Operator,例如:

$..[?(@.property2 =~ /misery.*?/i)].property2

演示:

您可以使用 Regular Expression Extractor

从变量中提取 4 位数的值

如果您想一次性完成:

  1. 将 JSR223 后处理器添加为 returns 以上 JSON
  2. 请求的子项
  3. 将以下代码放入"Script"区

    vars.put('misery', ((com.jayway.jsonpath.JsonPath.read(prev.getResponseDataAsString(), '$..[?(@.property2 =~ /misery.*?/i)].property2').get(0) =~ ('(\d+)'))[0][1]))
    
  4. 在需要时将提取的值引用为 ${misery}

更多信息:Apache Groovy - Why and How You Should Use It