REST ASSURED (JAVA): извлечь значение объекта json, учитывая его значение родительского объекта - PullRequest
1 голос
/ 21 мая 2019

Предположим, у меня есть следующий 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"
}]}

Я хотел бы извлечь только значение "first_name", которое принадлежит id = 6.

Я могу преодолеть это с помощью чего-то другого, но я хочу знать, есть ли прямой путь с успокоенным

Что-то, что я пробовал до сих пор: data.find {it.id == '6'} .first_name

это возможно? Если это правда, как это сделать? Благодарю.

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Я не уверен, что это решение будет именно тем, что вы ищете, но вы определенно можете извлечь имя на основе идентификатора.

Использовать библиотеку JsonPath в Rest Assured. Вы можете передать JSON как String JsonPath.from("json string") или получить его из Response следующим образом:

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» на консоль. Вы можете работать с этим кодом или создать метод для возврата параметра на основе идентификатора, например:

    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. Каждый объект представлен HashMap из String и Object, потому что он содержит разные типы. first_name - это строка, id - целое число, поэтому мы должны использовать HashMap со значением Objects в качестве второго универсального аргумента.

Затем мы перебираем HashMap, сравнивая id каждого объекта JSON для получения желаемых результатов.

Вы также можете использовать 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());
}
0 голосов
/ 29 мая 2019

Используйте ниже JsonPath, он даст вам first_name на основе идентификатора:

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