首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RestAssured:从json对象中获取指定值的键值

RestAssured:从json对象中获取指定值的键值
EN

Stack Overflow用户
提问于 2020-12-01 02:36:47
回答 3查看 1.4K关注 0票数 3

在测试用例中,我使用以下响应执行调用:

代码语言:javascript
运行
复制
[
    {
        "ourID": "770050010000000010",
        "date": "2019-03-07",
        "otherValue": null
    },
    {
        "ourID": "770050010000000020",
        "date": "2019-03-07",
        "otherValue": null
    }
]

测试由Serenity执行,我使用RestAssured执行调用:

代码语言:javascript
运行
复制
Response response = RestAssuredApiHelper.baseRestCall(headers, baseUrl, path)
                .body(requestBody)
                .post();

assertThat(response.getBody().jsonPath().get("$.[?(@.ourID=='770050010000000010')].date"), contains("2019-03-07"));

断言不起作用,可能是因为RestAssured使用Gpath而不是JsonPath,但在我读过的所有文档中都有这种方法的例子。这里我漏掉了什么?

我得到的错误是:

代码语言:javascript
运行
复制
java.lang.IllegalArgumentException: Invalid JSON expression:
Script1.groovy: 1: unexpected token: [ @ line 1, column 29.
                            $.[?(@.meteringPointEANID=='770050010000000010')].energySource
                               ^

1 error
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-01 18:51:06

在RestAssured中使用JsonPath的另一种方法是使用RestAssured的内置反序列化机制。

如果您不知道对象的返回类型是什么,可以查看以下内容:https://github.com/rest-assured/rest-assured/wiki/usage#deserialization-with-generics

一般的解决方案如下所示:

代码语言:javascript
运行
复制
Response response = RestAssuredApiHelper.baseRestCall(headers, baseUrl, path)
                .body(requestBody)
                .post();

List<Map<String, Object>> objects =  response.getBody().as(new TypeRef<>() {});
Map<String, Object> singleObject = objects.stream().filter((Map<String, Object> object) -> object.get("ourID").equals("770050010000000010"))
                .peek(System.out::println)
                .findFirst().get();

System.out.println(singleObject.get("ourID")); // 770050010000000010

如果你知道响应对象是什么,它就更简单了:

代码语言:javascript
运行
复制
List<YourResponseObject> yourResponseObjects = response.getBody().as(new TypeRef<>() {});
票数 1
EN

Stack Overflow用户

发布于 2020-12-01 03:20:49

用下面的代码检查:--(我相信json表达式是正确的,没有检查)

代码语言:javascript
运行
复制
Object dateObject = JsonPath.parse(response.getBody().asString()).read("$.[?(@.ourID=='770050010000000010')].date");
String dateString = dataObject.toString();
assertThat(dateString, containsString("2019-03-07"));

POM依赖:

代码语言:javascript
运行
复制
<!-- https://mvnrepository.com/artifact/com.jayway.jsonpath/json-path -->
<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.1.0</version>
</dependency>
票数 1
EN

Stack Overflow用户

发布于 2021-01-02 01:59:10

代码语言:javascript
运行
复制
assertEquals(response.path("find {it.ourID == '770050010000000010'}.date"), "2019-03-07")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65079264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档