Справочник Python

Полное руководство по языку на русском

JSON и сериализация

JSON — основы

import json  # импорт модуля для работы с JSON

data = {  # инициализация множества
    "name": "Анна",
    "age": 30,
    "is_student": False,
    "hobbies": ["чтение", "бег"],
    "address": None
}

# Парсинг строки
json_str = '{"name": "Анна", "age": 30}'  # строковое значение
parsed = json.loads(json_str)  # десериализация из JSON-строки

# В строку
json_str = json.dumps(data, ensure_ascii=False, indent=2)  # сериализация в JSON-строку

# Чтение из файла
with open("data.json", encoding="utf-8") as f:  # контекстный менеджер
    data = json.load(f)  # чтение JSON из файла

# Запись в файл
with open("data.json", "w", encoding="utf-8") as f:  # контекстный менеджер
    json.dump(data, f, ensure_ascii=False, indent=2)  # запись JSON в файл

Маппинг типов JSON ↔ Python

JSONPython
objectdict
arraylist
stringstr
number (int)int
number (real)float
true/falseTrue/False
nullNone

Сериализация объектов

from dataclasses import dataclass, asdict  # импорт модуля
import json  # импорт модуля для работы с JSON

@dataclass  # декоратор класса данных
class User:
    name: str
    age: int

user = User("Анна", 30)  # присваивание
json.dumps(asdict(user), ensure_ascii=False)  # сериализация в JSON-строку

# Кастомный сериализатор
class UserEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, User):  # условие
            return {"name": obj.name, "age": obj.age}  # возврат значения
        return super().default(obj)  # возврат значения

json.dumps(user, cls=UserEncoder, ensure_ascii=False)  # сериализация в JSON-строку

pickle — бинарная сериализация

import pickle  # импорт модуля бинарной сериализации

data = {"key": [1, 2, 3], "nested": {"a": 1}}  # инициализация словаря

# Сохранение в файл
with open("data.pkl", "wb") as f:  # контекстный менеджер
    pickle.dump(data, f)  # сериализация в файл

# Загрузка из файла
with open("data.pkl", "rb") as f:  # контекстный менеджер
    loaded = pickle.load(f)  # десериализация из файла

# Внимание: pickle небезопасен! Не загружайте данные из ненадёжных источников.

Другие форматы

# YAML — нужен PyYAML
import yaml  # импорт YAML
with open("config.yaml") as f:  # контекстный менеджер
    config = yaml.safe_load(f)  # присваивание

# TOML — нужен tomllib (3.11+) или tomli
import tomllib  # импорт TOML
with open("config.toml", "rb") as f:  # контекстный менеджер
    config = tomllib.load(f)  # присваивание

# CSV
import csv  # импорт модуля для работы с CSV
with open("data.csv", newline="") as f:  # контекстный менеджер
    reader = csv.DictReader(f)  # чтение CSV в словари
    for row in reader:  # цикл по элементам
        print(row)  # вывод в консоль

Полезные приёмы

# Сортировка ключей
json.dumps(data, sort_keys=True)  # сериализация в JSON-строку

# Компактный вывод
json.dumps(data, separators=(",", ":"))  # сериализация в JSON-строку

# Пропуск None
json.dumps(data, ignore_nan=True)  # сериализация в JSON-строку

# Красивый вывод для отладки
import pprint  # импорт модуля
pprint.pprint(data)  # вывод в консоль
pprint.pp(data)  # Python 3.8+