Найти в Дзене

Работа с 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.

Подписывайтесь:

Телеграм https://t.me/lets_go_code
Канал "Просто о программировании"
https://dzen.ru/lets_go_code