Формат JSON: загрузка и сохранение

Формат JSON: загрузка и сохранение

JSON (JavaScript Object Notation) — текстовый формат обмена данными, понятный человеку и машине. Конфигурационные файлы, API-ответы, база данных для небольших проектов — JSON везде. Встроенный модуль json позволяет легко читать и записывать JSON в Python.

Что такое JSON

JSON — это текст, синтаксис которого напоминает Python-словари и списки:

{
  "name": "Алиса",
  "age": 25,
  "active": true,
  "scores": [92, 87, 95],
  "address": {
    "city": "Москва",
    "zip": "101000"
  }
}

Ключевые отличия от Python: в JSON строки только в двойных кавычках, true/false (не True/False), null (не None).

Соответствие типов JSON ↔ Python

JSONPython
object {}dict
array []list
stringstr
numberint / float
true / falseTrue / False
nullNone

Загрузка JSON: json.loads и json.load

import json

# Из строки (loads — load string):
json_str = '{"name": "Алиса", "age": 25, "active": true}'
data = json.loads(json_str)
print(data)          # {'name': 'Алиса', 'age': 25, 'active': True}
print(type(data))    # <class 'dict'>
print(data["name"])  # Алиса

# Из файла (load):
with open("data.json", "r", encoding="utf-8") as f:
    data = json.load(f)

Сохранение JSON: json.dumps и json.dump

import json

person = {
    "name": "Борис",
    "age": 30,
    "skills": ["Python", "SQL"],
    "active": True,
    "bonus": None
}

# В строку (dumps — dump string):
json_str = json.dumps(person)
print(json_str)
# {"name": "Борис", "age": 30, "skills": ["Python", "SQL"], "active": true, "bonus": null}

# Красивый вывод с отступами:
pretty = json.dumps(person, ensure_ascii=False, indent=2)
print(pretty)
{
  "name": "Борис",
  "age": 30,
  "skills": [
    "Python",
    "SQL"
  ],
  "active": true,
  "bonus": null
}
  • indent=2 — отступы для читаемости
  • ensure_ascii=False — кириллица без экранирования (иначе Борис)
# В файл (dump):
with open("output.json", "w", encoding="utf-8") as f:
    json.dump(person, f, ensure_ascii=False, indent=2)

Практический пример: простая база данных

import json
from pathlib import Path

DB_FILE = Path("users.json")

def load_users():
    if not DB_FILE.exists():
        return []
    return json.loads(DB_FILE.read_text(encoding="utf-8"))

def save_users(users):
    DB_FILE.write_text(json.dumps(users, ensure_ascii=False, indent=2), encoding="utf-8")

def add_user(name, age):
    users = load_users()
    users.append({"name": name, "age": age})
    save_users(users)

add_user("Алиса", 25)
add_user("Борис", 30)
print(load_users())

Ошибки: json.JSONDecodeError

Если строка не является валидным JSON, json.loads() выбрасывает json.JSONDecodeError:

import json

try:
    data = json.loads("это не json")
except json.JSONDecodeError as e:
    print(f"Ошибка парсинга: {e}")

Проверь себя

Что вернёт json.loads('{"x": null, "y": true}')?

Python-словарь: {'x': None, 'y': True}. JSON null → Python None, JSON true → Python True.

Итог

  • json.loads(str) → Python-объект из JSON-строки; json.load(f) — из файла.
  • json.dumps(obj) → JSON-строка; json.dump(obj, f) — в файл.
  • ensure_ascii=False — кириллица без экранирования; indent=2 — читаемый вывод.
  • Типы: JSON nullNone, true/falseTrue/False, objectdict.
  • json.JSONDecodeError — невалидный JSON.

Модуль 10 завершён. В следующем модуле изучим обработку ошибок — как Python сигнализирует об исключениях и как их перехватывать и обрабатывать.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике