gpt4 book ai didi

java - 如何使用 Rest Assured 验证 JSON 2D 数组?

转载 作者:行者123 更新时间:2023-11-30 06:27:34 25 4
gpt4 key购买 nike

问题来了

第 1 部分:

{
"people": [
{
"name": "John",
"address": "765 the the",
"number": "3277772345",
},
{
"name": "Lee",
"address": "456 no where",
"number": "7189875432",
},
]
}

我想验证号码字段,即号码是否为“7189875432”“7189875432” 的 JSON 路径为:people[1]。 number(位于 JSON 数组内)。

为此,我进行了研究:

List<String> value=
given()
.when()
.get("/person")
.then()
.extract()
.path("people.findAll{it.number=='7189875432}. number");
If (value.isEmpty)
assert.fail();

该测试将通过。基本上,如果该值存在,它将返回该值的列表。这我明白了。但现在假设我有一个 JSON,例如:

第 2 部分

{
"people": [
{
"name": "John",
"address": "765 the the",
"phoneno": [
{
"number": "3277772345",

},
{
"number": "654787654",

},

]
},
{
"name": "Lee",
"address": "456 no where",
"phoneno": [
{
"number": "7189875432",

},
{
"number": "8976542234",

},
{
"number": "987654321",

},

]
},

]
}

现在我想验证电话号码“987654321”是否在JSON中。 JSON 路径:people[1].phoneno[2].number

List<String> value=
given()
.when()
.get("/person")
.then()
.extract()
.path("people.phoneno.findAll{it.number=='987654321'}. number");
If (value.isEmpty)
assert.fail();

此测试将失败,因为它将返回空字符串。

如果我对路径进行硬编码,例如:

.path("people[1].phoneno.findAll{it.number=='987654321'}. number");
If (value.isEmpty)
assert.fail(); // this test will pass

如果我也这样做

 .path("people.phoneno. number");
I would get a list such as [["987654321", "3277772345", "7189875432", "8976542234"]]

包含 JSON 中所有数字的列表。

所以我的问题是我们如何验证一个数组包含在另一个数组中的 JSON 路径?我不想硬编码任何东西。

注意:唯一可用的信息是数字,即“987654321”

最佳答案

您始终可以编写自己的自定义匹配器:

private static Matcher<List<List<String>>> containsItem(String item) {
return new TypeSafeDiagnosingMatcher<List<List<String>>>() {
@Override
protected boolean matchesSafely(List<List<String>> items, Description mismatchDescription) {
return items.stream().flatMap(Collection::stream).collect(toList()).contains(item);
}

@Override
public void describeTo(Description description) {
description.appendText(
String.format("(a two-dimensional collection containing \"%s\")", item));
}
};
}

然后使用这个匹配器:

given()
.when()
.get("/person")
.then()
.body("people.phoneno.number", containsItem("987654321"));

为了使该匹配器更加可重用,请将输入类型设置为通用:
private static <T> Matcher<List<List<T>>> containsItem(T item) {...}

关于java - 如何使用 Rest Assured 验证 JSON 2D 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46826973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com