Функции по работе с json
В Python для работы с JSON основная библиотека — json
(встроенная, устанавливать не нужно).
1. Основные функции модуля json
json
json.load(file_obj)
Читает JSON из открытого файла и преобразует в Python-объект
data = json.load(f)
json.loads(str)
Читает JSON из строки
data = json.loads('{"a":1}')
json.dump(obj, file_obj)
Записывает Python-объект в файл в формате JSON
json.dump(data, f)
json.dumps(obj)
Преобразует Python-объект в строку JSON
s = json.dumps(data)
2. Примеры
📄 Чтение JSON из файла
import json
with open("data.json", "r", encoding="utf-8") as f:
data = json.load(f)
print(data) # {'name': 'Kakha', 'age': 30}
📜 Чтение JSON из строки
import json
json_str = '{"name": "Kakha", "age": 30}'
data = json.loads(json_str)
print(data["name"]) # Kakha
💾 Запись JSON в файл
import json
data = {"name": "Kakha", "age": 30}
with open("output.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=4, ensure_ascii=False)
indent=4
— красивое форматирование.ensure_ascii=False
— чтобы сохранить кириллицу как есть, а не\u041a
.
🔄 Преобразование Python → JSON-строка
import json
data = {"name": "Каха", "age": 30}
json_str = json.dumps(data, indent=2, ensure_ascii=False)
print(json_str)
3. Особенности
Python
dict
↔ JSONobject
Python
list
↔ JSONarray
Python
str
↔ JSONstring
Python
int/float
↔ JSONnumber
Python
True/False
↔ JSONtrue/false
Python
None
↔ JSONnull
💡 В автотестах JSON часто используют:
для парсинга API-ответов (
response.json()
вrequests
)для хранения тестовых данных
для сравнения ожидаемого и фактического результата
1. Чтение тестовых данных из JSON
import json
import pytest
@pytest.fixture
def test_data():
with open("tests/data/user.json", encoding="utf-8") as f:
return json.load(f)
def test_user_data(test_data):
assert test_data["role"] == "admin"
💡 Так тесты остаются независимыми от кода — данные хранятся в отдельных файлах.
2. Работа с API и парсинг JSON
import requests
def test_api_get_user():
response = requests.get("https://reqres.in/api/users/2")
assert response.status_code == 200
data = response.json()
assert data["data"]["id"] == 2
assert "email" in data["data"]
💡 response.json()
— сразу отдаёт dict, без ручного json.loads()
.
3. Сравнение с эталонным JSON
import json
def test_api_response_matches_expected():
# Загружаем эталонный ответ
with open("tests/data/expected_user.json", encoding="utf-8") as f:
expected = json.load(f)
# Получаем фактический
actual = {
"name": "Kakha",
"age": 30
}
assert actual == expected
💡 Удобно, если JSON маленький и не содержит динамических полей.
4. Игнор динамических полей при сравнении
def remove_dynamic_fields(data: dict, fields_to_remove: list):
return {k: v for k, v in data.items() if k not in fields_to_remove}
def test_api_ignore_timestamps():
actual = {"id": 1, "createdAt": "2025-08-13T12:00:00Z"}
expected = {"id": 1, "createdAt": "<ignore>"}
assert remove_dynamic_fields(actual, ["createdAt"]) == \
remove_dynamic_fields(expected, ["createdAt"])
💡 Используется, когда API возвращает время, токены и другие переменные значения.
5. Валидация JSON-схемы
from jsonschema import validate
schema = {
"type": "object",
"properties": {
"id": {"type": "integer"},
"email": {"type": "string", "format": "email"}
},
"required": ["id", "email"]
}
def test_validate_json_schema():
data = {"id": 2, "email": "test@example.com"}
validate(instance=data, schema=schema)
💡 Это особенно любят спрашивать на собесах: как проверить, что API отдаёт данные правильного формата.
6. Преобразование JSON в строку для логов
import json
import logging
logging.basicConfig(level=logging.INFO)
def test_log_json():
data = {"status": "ok", "result": [1, 2, 3]}
logging.info(json.dumps(data, indent=2, ensure_ascii=False))
💡 Красивый лог помогает отлаживать тесты и понимать, что вернул API.
Last updated
Was this helpful?