在JAVA中循环通过SerenityRest响应

在JAVA中循环通过SerenityRest响应,java,response,rest-assured,serenity-bdd,Java,Response,Rest Assured,Serenity Bdd,我试图从cars对象中获得所有模型的计数,这是SerenityRest响应的一部分 Response response = SerenityRest.rest() .contentType("application/json") .when() .get("/api/"); if (response.statusCode() == 200) { int numUniqueModels = response.body().path("cars.

我试图从cars对象中获得所有模型的计数,这是SerenityRest响应的一部分

Response response = SerenityRest.rest()
        .contentType("application/json")
        .when()
        .get("/api/");
if (response.statusCode() == 200) {
   int numUniqueModels = response.body().path("cars.size()");  // 3
}
答复:

   "cars": {
       "Acura": [
           "ILX",
           "MDX",
           "TLX"
       ],
       "Audi": [
           "A3",
           "A4",
           "A6",
           "A7"
       ],
       "BMW": [
           "x",
           "y"
       ]
   }
比如说,

response.body().path("cars.size()") = 3,
但是我需要车的总数。Acura.size()+cars.Audi.size()+cars.BMW.size()来获得所有车型。但是,我不知道响应中是否会出现Acura、Audi或BMW的确切名称,因为车辆可能会动态变化。为了解决这个问题,我需要做一些循环,其中:

sum = 0; 
for (int i = 0; i < response.body().path("cars.size()"); i++) {
   sum += response.body().path("cars.[i].size()");
}
sum=0;
对于(int i=0;i
总和应给出车型总数=9。
问题在于,此语法:path(“cars[i].size()”)不正确。正确的调用是什么?

如果您想在放心的情况下发出复杂的请求,您必须遵循此处所述的Syntax:

请注意,JsonPath实现使用语法,不能与Jayway的实现混淆

因此,您必须使用groovy Syntax:

int total = JsonPath.from("{  "
              + " \"cars\": {\n"
              + "       \"Acura\": [\n"
              + "           \"ILX\",\n"
              + "           \"MDX\",\n"
              + "           \"TLX\"\n"
              + "       ],\n"
              + "       \"Audi\": [\n"
              + "           \"A3\",\n"
              + "           \"A4\",\n"
              + "           \"A6\",\n"
              + "           \"A7\"\n"
              + "       ],\n"
              + "       \"BMW\": [\n"
              + "           \"x\",\n"
              + "           \"y\"\n"
              + "       ]\n"
              + "   }"
              + "}")
        .getInt("cars.collect { it.value.size() }.sum()")
所以这个表达式应该使job
cars.collect{it.value.size()}.sum()
collect
方法类似于函数式编程中的map方法。因此,将集合
cars
HashMap与其值的
size()
进行映射,然后收集
sum()

编辑

所以你只需要做:

Response response = SerenityRest.rest()
        .contentType("application/json")
        .when()
        .get("/api/");
if (response.statusCode() == 200) {
   int numUniqueModels = response.body().path("cars.collect { it.value.size() }.sum()");  // 9
}

你能提供一个更大的代码样本,这样我就可以看到类型了吗?这是行不通的。我提到,反应是动态的,这意味着阿库拉,奥迪或宝马可能不在场。如果我不知道里面有什么,我怎么构造int-total=JsonPath.from(“…”),你试过了吗?JsonPath是方法
path(String)
使用的对象。表达式遍历
cars
条目并收集每个条目的大小。所以这应该适用于任何元素。所以您只需执行以下操作:
int numiniquemodels=response.body().path(“cars.collect{it.value.size()}.sum()”;//9
你明白了,兄弟,我用错语法了。再次感谢你的帮助!np家伙!寻找解决方案很有趣;)