JSON (JavaScript Object Notation) — это популярный формат обмена данными, который легко читается как людьми, так и машинами. В Python работа с JSON реализована через встроенный модуль json, предоставляющий инструменты для сериализации (преобразования объектов Python в JSON) и десериализации (преобразования JSON в объекты Python). В этой статье мы рассмотрим все аспекты работы с JSON в Python: от базовых операций до продвинутых техник.
1. Основы модуля json
Модуль json позволяет конвертировать данные между форматами Python и JSON. Основные методы:
- Сериализация (Python → JSON):
- json.dumps() — преобразует объект Python в строку JSON.
- json.dump() — записывает JSON в файл.
- Десериализация (JSON → Python):
- json.loads() — преобразует строку JSON в объект Python.
- json.load() — читает JSON из файла.
Пример сериализации:
import json
data = {
"name": "Alice",
"age": 30,
"is_student": False,
"courses": ["Math", "Physics"]
}
json_str = json.dumps(data, indent=4) # Форматирование с отступами
print(json_str)
Пример десериализации:
json_data = '{"name": "Bob", "age": 25, "city": "London"}'
python_dict = json.loads(json_data)
print(python_dict["name"]) # Вывод: Bob
2. Работа с файлами
Запись JSON в файл
with open("data.json", "w") as file:
....json.dump(data, file, indent=4)
Чтение JSON из файла
with open("data.json", "r") as file:
....loaded_data = json.load(file)
....print(loaded_data)
Обработка ошибок:
- json.JSONDecodeError возникает при некорректном JSON.
- Используйте блоки try-except для обработки исключений:
try:
....with open("invalid.json", "r") as file:
........data = json.load(file)
except json.JSONDecodeError as e:
....print(f"Ошибка декодирования: {e}")
3. Расширенные возможности
Кастомная сериализация
Для объектов, не поддерживаемых по умолчанию (например, datetime), используйте параметр default:
from datetime import datetime
def custom_serializer(obj):
....if isinstance(obj, datetime):
........return obj.isoformat()
....raise TypeError("Неподдерживаемый тип")
data = {"time": datetime.now()}
json_str = json.dumps(data, default=custom_serializer)
Кастомная десериализация
Параметр object_hook позволяет преобразовывать объекты JSON в пользовательские типы:
def custom_deserializer(dct):
....if "time" in dct:
........dct["time"] = datetime.fromisoformat(dct["time"])
....return dct
data = json.loads(json_str, object_hook=custom_deserializer)
Класс JSONEncoder
Для сложных сценариев сериализации создайте подкласс JSONEncoder:
class CustomEncoder(json.JSONEncoder):
....def default(self, obj):
........if isinstance(obj, datetime):
............return obj.isoformat()
........return super().default(obj)
json_str = json.dumps(data, cls=CustomEncoder)
4. Работа с вложенными структурами и Unicode
- Вложенные объекты: JSON автоматически обрабатывает словари и списки любой глубины.
- Кодировка: По умолчанию json экранирует не-ASCII символы. Чтобы сохранить их, укажите ensure_ascii=False:
json.dumps({"message": "Привет, мир!"}, ensure_ascii=False)
5. Производительность и альтернативные библиотеки
Для работы с большими объемами данных или повышенной скорости используйте сторонние библиотеки:
- ujson (UltraJSON): Быстрее встроенного модуля.
- orjson: Поддерживает даты, бинарные данные и работает ещё быстрее.
- simplejson: Аналог встроенного json с дополнительными возможностями.
Пример использования ujson:
import ujson
data = ujson.loads(json_str)
6. Практические примеры использования
Веб-API
Используйте JSON для взаимодействия с API через библиотеку requests:
import requests
response = requests.get("https://api.example.com/data")
data = response.json()
print(data["results"])
Конфигурационные файлы
JSON подходит для хранения настроек приложения:
# Запись конфига
config = {"theme": "dark", "language": "ru"}
with open("config.json", "w") as f:
....json.dump(config, f)
# Чтение конфига
with open("config.json", "r") as f:
....loaded_config = json.load(f)
7. Частые ошибки и лучшие практики
- Избегайте eval(): Не используйте eval() для парсинга JSON — это небезопасно.
- Валидация данных: Проверяйте структуру JSON с помощью схем (например, библиотека jsonschema).
- Обработка исключений: Всегда обрабатывайте JSONDecodeError и FileNotFoundError.
- Кэширование: При частом чтении больших JSON-файлов кэшируйте данные.
Заключение
JSON — это универсальный инструмент для хранения и передачи данных, а Python предоставляет удобные средства для работы с ним. Освоение модуля json и связанных библиотек позволяет эффективно решать задачи интеграции, настройки приложений и анализа данных. Для проектов с высокими требованиями к производительности используйте оптимизированные библиотеки вроде ujson или orjson.
Подписывайтесь:
Телеграм https://t.me/lets_go_code
Канал "Просто о программировании" https://dzen.ru/lets_go_code