Работа с JSON: модуль json
Модуль json в Python: сериализация и десериализация, dumps/loads, dump/load, работа с JSON-файлами и кодировка Unicode.
JSON (JavaScript Object Notation) — текстовый формат обмена данными, понятный и людям, и машинам. Python-модуль
jsonпреобразует словари и списки в JSON-строки и обратно.
Соответствие типов Python и JSON
Python | JSON |
| object |
| array |
| string |
| number |
|
|
|
|
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