Формат 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
| JSON | Python |
|---|---|
object {} | dict |
array [] | list |
string | str |
number | int / float |
true / false | True / False |
null | None |
Загрузка 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
null↔None,true/false↔True/False,object↔dict. json.JSONDecodeError— невалидный JSON.
Модуль 10 завершён. В следующем модуле изучим обработку ошибок — как Python сигнализирует об исключениях и как их перехватывать и обрабатывать.