1. Основы модуля `json`

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.