在 JAVA 中循环遍历 SerenityRest 响应

我正在尝试从汽车对象中获取所有模型的数量,这是 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,

但我需要 cars.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()");

}

总和应该给出汽车模型的总数 = 9。问题是这个语法:path("cars.[i].size()") 不正确。正确的叫法是什么?


饮歌长啸
浏览 100回答 1
1回答

RISEBY

如果您想放心地提出复杂的请求,则必须遵循此处描述的 synthax&nbsp;groovy gpath,如此处rest-assured doc所述:请注意,JsonPath 实现使用Groovy 的 GPath语法,不要与 Jayway 的JsonPath实现混淆。所以你必须玩一些 groovy synthax:int total = JsonPath.from("{&nbsp; "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + " \"cars\": {\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp; &nbsp; &nbsp;\"Acura\": [\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\"ILX\",\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\"MDX\",\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\"TLX\"\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp; &nbsp; &nbsp;],\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp; &nbsp; &nbsp;\"Audi\": [\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\"A3\",\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\"A4\",\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\"A6\",\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\"A7\"\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp; &nbsp; &nbsp;],\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp; &nbsp; &nbsp;\"BMW\": [\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\"x\",\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\"y\"\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp; &nbsp; &nbsp;]\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "&nbsp; &nbsp;}"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "}")&nbsp; &nbsp; &nbsp; &nbsp; .getInt("cars.collect { it.value.size() }.sum()")所以这个表达式应该可以工作cars.collect { it.value.size() }.sum()。该collect方法就像函数式编程中的 map 方法。因此,您将集合carsHashMap映射到size()它的值,然后收集sum()!编辑所以你只需要做:Response response = SerenityRest.rest()&nbsp; &nbsp; &nbsp; &nbsp; .contentType("application/json")&nbsp; &nbsp; &nbsp; &nbsp; .when()&nbsp; &nbsp; &nbsp; &nbsp; .get("/api/");if (response.statusCode() == 200) {&nbsp; &nbsp;int numUniqueModels = response.body().path("cars.collect { it.value.size() }.sum()");&nbsp; // 9}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java