Работа с JSON: модуль json

Модуль json в Python: сериализация и десериализация, dumps/loads, dump/load, работа с JSON-файлами и кодировка Unicode.

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

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

Python

JSON

dict

object {}

list

array []

str

string ""

int, float

number

True / False

true / false

None

null

json.dumps() — объект → строка

import json

data = {
    "name": "Алиса",
    "age": 28,
    "skills": ["Python", "SQL"],
    "active": True,
}

# Компактная строка
compact = json.dumps(data, ensure_ascii=False)
print(compact)

# Читаемый формат с отступами
pretty = json.dumps(data, ensure_ascii=False, indent=2)
print(pretty)

Вывод:

{"name": "Алиса", "age": 28, "skills": ["Python", "SQL"], "active": true}
{
  "name": "Алиса",
  "age": 28,
  "skills": [
    "Python",
    "SQL"
  ],
  "active": true
}

Параметр ensure_ascii=False разрешает кириллицу в выводе. По умолчанию Python экранирует символы вне ASCII: "Алиса""Алиса".

json.loads() — строка → объект

import json

raw = '{"city": "Москва", "population": 12600000, "capital": true}'
city = json.loads(raw)

print(type(city))
print(city["city"])
print(city["population"] // 1_000_000, "млн человек")

Вывод:

<class 'dict'>
Москва
12 млн человек

Работа с файлами: dump() и load()

import json

users = [
    {"id": 1, "name": "Иван", "role": "admin"},
    {"id": 2, "name": "Мария", "role": "user"},
]

# Запись в файл
with open("users.json", "w", encoding="utf-8") as f:
    json.dump(users, f, ensure_ascii=False, indent=2)

# Чтение из файла
with open("users.json", "r", encoding="utf-8") as f:
    loaded = json.load(f)

print(f"Загружено {len(loaded)} пользователей")
for user in loaded:
    print(f"  {user['id']}: {user['name']} ({user['role']})")

Вывод:

Загружено 2 пользователей
  1: Иван (admin)
  2: Мария (user)

Обработка ошибок

import json

bad_json = '{"name": "Тест", age: 25}'   # ошибка: age без кавычек

try:
    data = json.loads(bad_json)
except json.JSONDecodeError as e:
    print(f"Неверный JSON: {e}")
    print(f"Позиция ошибки: строка {e.lineno}, столбец {e.colno}")

Вывод:

Неверный JSON: Expecting property name enclosed in double quotes: line 1 column 18 (char 17)
Позиция ошибки: строка 1, столбец 18

Коротко

  • json.dumps(obj) — объект Python → JSON-строка; json.loads(s) — JSON-строка → объект.
  • json.dump(obj, f) — запись в файл; json.load(f) — чтение из файла.
  • Используйте ensure_ascii=False для сохранения кириллицы и indent=2 для читаемого форматирования.
  • Ошибки разбора — json.JSONDecodeError; перехватывайте при работе с внешними данными.
Проверьте себя
1. Какая функция преобразует Python-объект в JSON-строку?
Ajson.load()
Bjson.loads()
Cjson.dump()
Djson.dumps()
2. Что сделает параметр ensure_ascii=False в json.dumps()?
AОтключит проверку синтаксиса JSON
BПозволит выводить не-ASCII символы (кириллицу) без экранирования
CУскорит сериализацию
DДобавит BOM-маркер в начало строки
3. Во что Python-модуль json преобразует None при сериализации?
A"None"
B"undefined"
Cnull
D0
Поддержать проект