【问题标题】:Jmeter JSON Extractor retrieve the second item from last of a listJmeter JSON Extractor 从列表的最后一个检索第二个项目
【发布时间】:2017-06-26 13:59:25
【问题描述】:

我有一个如下所示的 JSON 响应

{
    "queryStartDate": "20170523134739822",
    "queryEndDate": "20170623134739822",
    "Rows": [
        {
            "hasScdHistoryOnly": false,
            "Values": [
                       "1",
                       "53265",
                       "CO"
            ]
        },
        {
            "hasScdHistoryOnly": false,
            "Values": [
                       "1",
                       "137382",
                       "CO"
                      ]
        },
        {
            "hasScdHistoryOnly": false,
            "Values": [
                       "1",
                       "310824",
                       "CO"
                      ]
        }
    ]
}

我正在使用 Jmeter 的 JSON Extractor 后处理器从“值”列表的最后一个接收第二个值。即 53265、137382、310824。

我尝试过使用$.Rows[*].Values[-2:-1]$.Rows[*].Values[(@.length-2)],根据Stefan的介绍:http://goessner.net/articles/JsonPath/index.html#e2,但它们都不起作用。你能帮帮我吗?

【问题讨论】:

    标签: json jmeter


    【解决方案1】:

    我相信 JMeter 正在使用 JayWay JSON 路径库,因此您应该寻找文档 here


    一般来说,我建议使用 JSR223 PostProcessor 作为 JSON 路径提取器的替代方案,两者都仅适用于基本场景,当涉及到高级查询和运算符时,它们的行为是不稳定的。

    1. 将 JSR223 PostProcessor 添加为返回 JSON 以上的请求的子项
    2. 确保在“语言”下拉菜单中选择了“groovy”,并勾选了“缓存已编译脚本(如果可用)”框
    3. 将以下代码放入“脚本”区域

      def values = com.jayway.jsonpath.JsonPath.parse(prev.getResponseDataAsString()).read('$..Values')
      
      values.eachWithIndex { val, idx ->
          vars.put('yourVar_' + (idx + 1), val.get(val.size()-2))
      }
      
    4. 它应该生成以下 JMeter 变量:

      yourVar_1=53265
      yourVar_2=137382
      yourVar_3=310824
      

      这似乎是您正在寻找的东西。

    参考资料:

    【讨论】:

      【解决方案2】:

      使用View Results tree的JSon Path Tester,我可以看到您用于提取值的以下表达式不正确(在线JSONPath Online Evaluator正确,但不适用于JMeter)

      使用的表达式:$.Rows[*].Values[-2:-1]

      来自 JSon 路径测试器的输出:No Match Found.

      使用的表达式:$.Rows[*].Values[(@.length-2)]

      来自 JSon 路径测试器的输出:Exception: Could not parse token starting at position 16. Expected ?, ', 0-9, *

      如果使用表达式$.Rows[*].Values[1],它将提取所需的响应。

      使用的表达式:$.Rows[*].Values[1]

      来自 JSon 路径测试器的输出:

       Result[0]=53265
       Result[1]=137382
       Result[2]=310824
      

      【讨论】:

      • 谢谢阿德南,我目前正在使用这种方法作为解决方法。我想知道在 Jmeter 的 JSON 提取器中,实际上是否有一种从最后一项向后选择的方法。在这种情况下,可以从第一个中向前选择。但也有 JSON 未规范化但需要向后选择的情况。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 2021-05-05
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      相关资源
      最近更新 更多