1. Основы модуля `json`
Работа с JSON в Python: Полное руководство
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.