Ответ
В тестировании API часто нужно извлекать и проверять конкретные поля из JSON-ответа. Я использую библиотеки для работы с JSON, которые позволяют делать это безопасно и выразительно.
Пример на Java (с использованием RestAssured и JsonPath):
import io.restassured.path.json.JsonPath;
String jsonResponse = given().when().get("/api/user/123").asString();
// Извлечение значений по пути
JsonPath jp = new JsonPath(jsonResponse);
int userId = jp.getInt("data.user.id");
String userName = jp.getString("data.user.name");
// Извлечение подмножества полей в новый объект (например, для сравнения)
Map<String, Object> userDetails = jp.getMap("data.user", new TypeRef<Map<String, Object>>() {});
// Теперь можно проверить только нужные ключи из userDetails
assertThat(userDetails).containsOnlyKeys("id", "name", "email");
Пример на Python (с использованием requests и json):
import json
import requests
response = requests.get("/api/user/123")
data = response.json()
# Прямое извлечение с проверкой наличия ключа
user_id = data.get('data', {}).get('user', {}).get('id')
# Или с использованием jsonpath-ng для сложных путей
from jsonpath_ng import parse
expr = parse("$.data.user.name")
matches = [match.value for match in expr.find(data)]
Ключевые моменты:
- Защита от
NullPointerException: Всегда проверяю существование промежуточных узлов, используя безопасные методы вроде.get()в Python или проверкиjp.get("path") != nullв Java. - Использование JSONPath: Для сложных или вложенных структур JSONPath гораздо удобнее, чем ручной разбор.
- Валидация схемы: Часто вместо извлечения полей достаточно проверить, что ответ соответствует ожидаемой JSON Schema, что гарантирует наличие и тип всех необходимых полей.