在JAVA中循环通过SerenityRest响应
我试图从cars对象中获得所有模型的计数,这是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.
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()")
所以这个表达式应该使jobcars.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家伙!寻找解决方案很有趣;)