Я не уверен, что это решение будет именно тем, что вы ищете, но вы определенно можете извлечь имя на основе идентификатора.
Использовать библиотеку 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());
}