0

我能够使用 RESTAssured 从服务中检索 JSON。

我想使用 JSONPath 功能来提取 JSON,然后使用 JSONAssert 进行比较。

这是我的例子:

@Test
public void doAPITestExample() throws JSONException {
    // retrieve JSON from service
    Response response = RestAssured.given().get("http://localhost:8081/mockservice");
    response.then().assertThat().statusCode(200);

    String body = response.getBody().asString();
    System.out.println("Body:" + body);
    /*
        {"datetime": "2018-06-21 17:48:07.488384", "data": [{"foo": "bar"}, {"test": "this is test data"}]}
    */

    // able to compare entire body with JSONAssert, strict=false
    Object data = response.then().extract().path("data");
    System.out.println("Response data:");
    System.out.println(data.getClass()); // class java.util.ArrayList
    System.out.println(data.toString());

    // JSONAssert data with strict=false
    String expectedJSON = "{\"data\":[{\"foo\": \"bar\"}, {\"test\": \"this is test data\"}]}";
    JSONAssert.assertEquals(expectedJSON, response.getBody().asString(), false);

    // How do I extract JSON with JSONPath, use JSONAssert together?
}

方法一——使用 JSONPath 获取 JSONObject

如何让 JSONPath 返回 JSONAssert 可以使用的 JSONObject?

在代码示例中:

Object data = response.then().extract().path("data");

这会返回一个java.util.ArrayList. 这如何与 JSONAssert 一起使用来与预期的 JSON 进行比较?

方法 2 - 使用 JSONParser 解析提取的数据

如果我这样做data.toString(),这将返回一个由于缺少对带有空格字符串的字符串值的引号处理而无法解析的字符串:

String dataString = response.then().extract().path("data").toString();
JSONArray dataArray = (JSONArray) JSONParser.parseJSON(dataString);

结果:

org.json.JSONException: Unterminated object at character 24 of [{foo=bar}, {test=this is test data}]

方法 3 - 使用 JSON 模式验证

是否可以仅从 JSON 中提取data属性并在该部分上针对 JSON Schema 运行该属性?

注意:返回的整个 JSON 非常大。我只想从中验证data属性。

执行 JSON 模式验证的示例会仅查找 JSON 中的data属性吗?

谢谢;

4

1 回答 1

0

您可以在响应对象中使用方法 jsonPath。

例子:

// this will return bar as per your example response.
String foo = response.jsonPath ().getString ("data[0].foo"); 

有关 JSON 路径的更多信息,请查看此处

于 2018-06-25T09:11:49.470 回答