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
| JSON | Python |
| object | dict |
| array | list |
| string | str |
| number (int) | int |
| number (real) | float |
| true/false | True/False |
| null | None |
Сериализация объектов
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+