REST ASSURED(JAVA):根据给定的父对象值提取json对象值

时间:2019-05-21 11:26:51

标签: java json rest-assured rest-assured-jsonpath

假设我有以下json:

{
  "page": 2,
  "per_page": 3,
  "total": 12,
  "total_pages": 4,
  "data": [
 {
    "id": 4,
    "first_name": "Eve",
    "last_name": "Holt",
    "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/marcoramires/128.jpg"
},
{
    "id": 5,
    "first_name": "Charles",
    "last_name": "Morris",
    "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/stephenmoon/128.jpg"
},
{
    "id": 6,
    "first_name": "Tracey",
    "last_name": "Ramos",
    "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/bigmancho/128.jpg"
}]}

我只想提取属于id = 6的“ first_name”的值。

我可以用其他方法解决这个问题,但是我想知道是否有一种放心的方法

到目前为止,我已经尝试过以下方法: data.find {it.id =='6'} .first_name

有可能吗?如果为真,该怎么做? 谢谢。

2 个答案:

答案 0 :(得分:1)

我不确定该解决方案是否是您要寻找的解决方案,但是您绝对可以根据ID提取名字。

使用JsonPath中的Rest Assured库。您可以将JSON作为字符串JsonPath.from("json string")传递,也可以像这样从Response获取JSON:

JsonPath path = response.jsonPath();

然后,您可以获得data数组并像这样迭代其元素:

    List<HashMap<String, Object>> data = path.getList("data");
    for (HashMap<String, Object> singleObject : data) {
        if (singleObject.get("id").equals(6)) {
            System.out.println(singleObject.get("first_name"));
        }
    }

上面将在控制台上打印名称“ Tracey”。 您可以使用此代码,也可以创建一种基于id的返回参数的方法,如下所示:

    private static String getFirstNameById(JsonPath path, int id) {
        List<HashMap<String, Object>> data = path.getList("data");
        for (HashMap<String, Object> singleObject : data) {
            if (singleObject.get("id").equals(id)) {
                return (String) singleObject.get("first_name");
            }
        }
        throw new NoSuchElementException(String.format("Can't find first_name with id: %d", id));
    }

只需确保您了解-data数组中的每个元素都是JSON对象。我们使用方法getList收集所有对象。每个对象都由HashMapString中的Object表示,因为它包含不同的类型。 first_name是String,id是Integer,这就是为什么我们必须使用Objects的HashMap作为第二个通用参数的原因。

然后我们遍历HashMap,比较每个JSON对象的id以获得所需的结果。

如果愿意,您也可以使用Java Stream。相同的方法如下所示:

List<HashMap<String, Object>> data = JsonPath.from(json).getList("data");
Optional<String> firstName = data.stream().filter(x -> x.get("id").equals(6)).map(x -> (String) x.get("first_name")).findFirst();
if (firstName.isPresent()) {
    System.out.println(firstName.get());
}

答案 1 :(得分:0)

在JsonPath下使用,它将根据ID为您提供first_name:

[?(@.id ==4)].first_name