当前位置: 首页 > 知识库问答 >
问题:

JMeter:如何使用jsonpath计算数组中的JSON对象

沈运恒
2023-03-14

在JMeter中,我想检查从服务器接收到的JSON数组中的对象数。

例如,在一个特定的请求中,我期望一个包含5个对象的数组。

[{...},{...},{...},{...},{...}]

读完这个:使用jsonpath?计数成员后,我尝试使用以下JSON路径断言:

  • JSON路径:$

然而,这似乎没有正常工作。当我真的在数组中收到5个对象时,响应断言说它不匹配。

我做错了什么?或者我还能怎么做?

共有2个答案

宋高谊
2023-03-14

对于您正在使用的插件(JMeter插件),这是不可能的。

但是,自从JMeter 3.0以来,这个插件已经由UbikLoadPack捐赠,可以用JSON提取器来完成(http://jmeter.apache.org/changes_history.html)

例子:

假设这个JSON包含一系列书籍:

   { "store": {"book": [
      { "category": "reference","author": "Nigel Rees","title":      "Sayings of the Century","price": 8.95},
      { "category": "fiction","author": "Evelyn Waugh","title": "Sword of Honour","price": 12.99},
      { "category": "fiction","author": "Herman Melville","title": "Moby Dick","isbn": "0-553-21311-3","price": 8.99},
      { "category": "fiction","author": "J. R. R. Tolkien","title": "The Lord of the Rings","isbn": "0-395-19395-8","price": 22.99}
   ],
    "bicycle": {"color": "red","price": 19.95}} }

要做到这一点:

1/添加JSON提取器:

然后,您可以通过以下方式访问该计数:

${bookTitle_matchNr}

运行此测试计划将显示以下内容:

如您所见,Debug Sampler-${bookTitle_matchNr}显示了Debug Sampler-4

薛祯
2023-03-14

虽然JSONPath提取器不提供hasSize功能,但它仍然可以完成。

根据PMD UBIK-INGENIERIE给出的答案中的JSON示例,您可以通过至少两种方式在book数组中获取匹配数:

1.最简单(但脆弱)的方法——使用正则html" target="_blank">表达式提取器。

如您所见,category有4个条目,如:

{ "category": "reference",
{ \"category\": \"fiction\"
...

如果添加正则表达式提取器,其配置如下:

它将捕获所有类别条目并返回匹配编号如下:

因此,您将能够在任何需要的地方使用这个${matches_matchNr}变量。

这种方法很简单,也很容易实现,但是它很容易受到响应格式的任何更改的影响。如果您预计JSON数据在可预见的未来可能会发生变化,请继续使用下一个选项。

2.更难(但更稳定)的方法——从Beanshell后处理器调用JsonPath方法

JMeter有一个Beanshell脚本扩展机制,可以访问范围内的所有变量/属性,以及底层JMeter和第三方依赖API。在这种情况下,您可以直接从Beanshell后处理器调用JsonPath库(位于JsonPath提取器的引擎盖下)。

import com.jayway.jsonpath.Criteria;
import com.jayway.jsonpath.Filter;
import com.jayway.jsonpath.JsonPath;

Object json = new String(data);
List categories = new ArrayList();
categories.add("fiction");
categories.add("reference");
Filter filter = Filter.filter(Criteria.where("category").in(categories));
List books = JsonPath.read(json, "$.store.book[?]", new Filter[] {filter});

vars.put("JSON_ARRAY_SIZE", String.valueOf(books.size()));

上面的代码根据父采样器响应计算$.store.book [?] 的JSONPath表达式,计数匹配的数字并将其存储到${JSON_ARRAY_SIZE}JMeter变量中

以后可以在if子句或断言中重用。

参考资料:

  • JMeter-使用JSON-提取JSON响应
  • JMeter的用户手册正则表达式条目
  • JSON路径文档和示例
  • 如何使用BeanShell:JMeter最喜欢的内置组件
 类似资料:
  • 是否可以使用JsonPath计算成员数? 使用spring mvc测试,我正在测试一个生成 具有 我想确保生成的json中没有其他成员。希望通过使用jsonPath计算它们。可能吗?也欢迎其他解决方案。

  • 问题内容: 这是我的JSON: 如何计算其中的对象数量? 问题答案: 那是一个数组。 您可以解析它(),然后使用该属性。

  • 我使用jayway JsonPath库使用给定的路径解析JSON。如果我给出正确的路径,我就能得到字符串值。但是,如果路径是数组,我想在给出路径时得到贴图列表。例如,我有一个JSON,如下所示: 下面是我用来解析json的代码。 如果我给出路径,我正在获取字符串,但我需要地图列表。下面是我使用jsonpath解析Json的代码。 任何人建议适当的方法来得到我所期望的。

  • 我正在寻找为json对象中的所有字段打印jsonpath的Java API。需求的第一部分是,对于给定的json对象(或字符串)- 它应该以key-value的方式打印所有属性,其中key是字段的jsonpath。 输出应该如下所示- 等等。这将用于匹配来自另一个json对象的值(我的第二个需求)。 我找到了一个APIhttps://github.com/json-path/JsonPath,它有

  • 我试图从json文件中获取一个对象数组,但遇到了一个问题。 我应该使用什么路径来获取项目中的所有项目(item0、item1、item2…)? 你能给我一个怎么做的建议吗。 Json 示例 从items对象中过滤item的最佳方法,但我不知道如何使用json路径。

  • 问题内容: 我有一个简单的应用程序,它需要遍历一个大型数组(包含约2万个项目),并且在每个数组中,我解析一个子数组。每个项目如下所示: 我正在遍历每个项目。我要做的是首先读取长度,然后简单地遍历整个数组。但这非常慢(例如每秒1个项目)。 有没有优化的方法? 问题答案: 得到它了。多亏了Erwin,我可以一次将整个JSON解析成一个简单的样子: 然后我们可以简单地调用以访问循环中的特定项目: