← Назад к вопросам

Делал ли преобразование JSON

1.8 Middle🔥 192 комментариев
#API тестирование#Фреймворки тестирования

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Опыт работы с JSON и его преобразованиями

Да, я неоднократно выполнял преобразования JSON в рамках автоматизации тестирования API, интеграционных тестов и работы с конфигурациями. JSON (JavaScript Object Notation) — это стандартный, легковесный формат для обмена данными, и умение манипулировать им является критически важным навыком для QA Automation Engineer.

Вот ключевые аспекты и примеры преобразований JSON, с которыми я работал:

1. Типы преобразований JSON

  • Сериализация и десериализация: Самый частый сценарий — преобразование объектов языка программирования (например, Java-классов или Python-словарей) в JSON-строку для отправки в API-запросе и обратного преобразования JSON-ответа в объекты для удобного анализа.
  • Модификация структуры: Изменение существующего JSON — добавление, удаление или изменение полей и значений, часто для подготовки тестовых данных с различными параметрами.
  • Форматирование и валидация: Приведение «некрасивого» JSON (minified) к читаемому виду (pretty print) для логирования и отладки, а также проверка его структуры против JSON Schema.
  • Преобразование в другие форматы: В некоторых случаях требовалось конвертировать JSON в YAML (для конфигураций), XML (устаревшие системы) или в плоские структуры (например, CSV).

2. Инструменты и библиотеки

Для этих задач я использовал различные библиотеки в зависимости от стека технологий:

  • В экосистеме Java: Jackson ObjectMapper (наиболее мощный и гибкий) и Gson. Jackson позволяет тонко настраивать процесс маппинга с помощью аннотаций.
  • В Python: Встроенный модуль json, а также сторонние библиотеки, такие как pydantic для валидации и сериализации на основе моделей данных.
  • В JavaScript/TypeScript: Встроенный объект JSON (JSON.parse(), JSON.stringify()).
  • Утилиты командной строки: jq — невероятно мощный инструмент для фильтрации, преобразования и извлечения данных из JSON прямо в bash-скриптах или пайплайнах CI/CD.

3. Практические примеры из автоматизации

Пример 1: Десериализация ответа API и извлечение данных для проверки (Python)

Часто после получения ответа от сервера нужно проверить конкретное поле.

import json
import requests

# Получаем JSON-ответ от API
response = requests.get('https://api.example.com/users/1')
response_json = response.json()  # Автоматическая десериализация в dict

# Преобразуем для удобства чтения в логах
pretty_json = json.dumps(response_json, indent=2, ensure_ascii=False)
print(f"Полный ответ:\n{pretty_json}")

# Извлекаем значение по сложному пути (например, город первого адреса пользователя)
user_city = response_json.get('address', {}).get('city')
assert user_city == 'Moscow', f"Expected city Moscow, got {user_city}"

Пример 2: Создание и сериализация динамического тела запроса (Java с Jackson)

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

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class JsonTransformation {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // 1. Создаем JSON объект "с нуля"
        ObjectNode orderRequest = mapper.createObjectNode();
        orderRequest.put("orderId", 12345);
        orderRequest.put("customer", "Ivan Petrov");
        orderRequest.putArray("items")
                .addObject()
                .put("sku", "BOOK-001")
                .put("quantity", 2);

        // 2. Сериализуем объект в JSON-строку для отправки
        String requestBody = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(orderRequest);
        System.out.println("Тело запроса:\n" + requestBody);

        // 3. Предположим, мы получили ответ и хотим изменить его для следующего запроса
        String jsonResponse = "{\"status\":\"NEW\", \"total\":50.0}";
        JsonNode responseNode = mapper.readTree(jsonResponse);

        // Модифицируем: меняем статус и добавляем поле
        ((ObjectNode) responseNode).put("status", "PROCESSING");
        ((ObjectNode) responseNode).put("discountApplied", true);

        System.out.println("Модифицированный ответ:\n" + responseNode.toPrettyString());
    }
}

Пример 3: Использование jq в CI/CD пайплайне (Bash)

Для извлечения конкретного значения (например, ID созданного ресурса) из JSON-ответа в скрипте развертывания или теста.

# Допустим, скрипт создает ресурс через curl и получает JSON-ответ
CREATE_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" \
  -d '{"name":"test-environment"}' \
  https://api.example.com/environments)

# Используем jq для извлечения поля 'id' из ответа
RESOURCE_ID=$(echo $CREATE_RESPONSE | jq -r '.id')

# Теперь используем этот ID в следующем запросе
echo "Создан ресурс с ID: $RESOURCE_ID"
curl -s -X GET "https://api.example.com/environments/$RESOURCE_ID"

4. Сложные сценарии и лучшие практики

  • Работа с вложенными и изменяющимися структурами: Я использовал рекурсивные функции или библиотеки типа JsonPath (аналоги XPath для XML) для навигации по сложным JSON.
  • Сравнение JSON: Не просто текстовое сравнение, а семантическое (игнорируя порядок элементов в массивах или пробелы). Для этого использовались специализированные библиотеки, такие как JSONAssert в Java или глубокое сравнение словарей в Python.
  • Шаблонизация: Для сложных тестовых данных применял шаблонизаторы (например, Jinja2 в Python), чтобы генерировать JSON из шаблонов с подстановкой переменных.

Вывод: Преобразование JSON — это неотъемлемая часть повседневной работы автоматизатора. Это включает в себя гораздо больше, чем просто парсинг строки; это создание, глубокое изменение, валидация и интеллектуальное сравнение структур данных, что напрямую влияет на надежность и поддерживаемость автотестов.