Цель: Научиться сохранять и загружать данные в формате JSON.
Что такое JSON?
JSON (JavaScript Object Notation) — текстовый формат для хранения данных. Выглядит как словарь Python, читается людьми, поддерживается всеми языками.
{
"name": "Алиса",
"age": 25,
"balance": 1000.50,
"transactions": ["deposit", "withdraw"]
}
Соответствие типов Python и JSON
| Python | JSON |
|---|---|
dict |
Object {} |
list |
Array [] |
str |
String "текст" |
int, float |
Number 42, 3.14 |
True, False |
true, false |
None |
null |
Основные функции модуля json
import json
# json.dump() — сохранить в файл
# json.load() — загрузить из файла
# json.dumps() — преобразовать в строку
# json.loads() — преобразовать из строки
Сохранение: json.dump()
import json
user = {
"name": "Алиса",
"age": 25,
"balance": 1000
}
with open("user.json", "w", encoding="utf-8") as file:
json.dump(user, file, indent=4, ensure_ascii=False)
Параметры:
- indent=4 — отступы для читаемости
- ensure_ascii=False — сохраняет кириллицу
Результат в user.json:
{
"name": "Алиса",
"age": 25,
"balance": 1000
}
Загрузка: json.load()
import json
with open("user.json", "r", encoding="utf-8") as file:
user = json.load(file)
print(user["name"]) # Алиса
print(user["balance"]) # 1000
Безопасная загрузка с try/except
Файл может не существовать или быть повреждён — всегда оборачивай загрузку:
import json
try:
with open("user.json", "r", encoding="utf-8") as file:
user = json.load(file)
print("Данные загружены!")
except FileNotFoundError:
print("Файл не найден, создаём новый профиль.")
user = {"name": "Незнакомец", "age": 0, "balance": 0}
except json.JSONDecodeError:
print("Файл повреждён, используем значения по умолчанию.")
user = {"name": "Незнакомец", "age": 0, "balance": 0}
Практический пример: BankAccount
import json
class BankAccount:
def __init__(self, name, balance=0):
self.name = name
self.balance = balance
self.transactions = []
def deposit(self, amount):
self.balance += amount
self.transactions.append(f"Пополнение: +{amount}")
def withdraw(self, amount):
if amount > self.balance:
print("Недостаточно средств!")
return
self.balance -= amount
self.transactions.append(f"Снятие: -{amount}")
def save(self, filename):
data = {
"name": self.name,
"balance": self.balance,
"transactions": self.transactions
}
with open(filename, "w", encoding="utf-8") as file:
json.dump(data, file, indent=4, ensure_ascii=False)
@staticmethod
def load(filename):
try:
with open(filename, "r", encoding="utf-8") as file:
data = json.load(file)
account = BankAccount(data["name"], data["balance"])
account.transactions = data["transactions"]
return account
except FileNotFoundError:
print("Файл не найден!")
return None
# Использование
account = BankAccount("Алиса", 1000)
account.deposit(500)
account.withdraw(200)
account.save("alice.json")
loaded = BankAccount.load("alice.json")
print(f"Баланс: {loaded.balance} руб.")
print(f"История: {loaded.transactions}")
Содержимое alice.json:
{
"name": "Алиса",
"balance": 1300,
"transactions": [
"Пополнение: +500",
"Снятие: -200"
]
}
json.dumps() и json.loads() — работа со строками
import json
# dumps() — словарь → строка (для API, сети, логов)
data = {"name": "Алиса", "age": 25}
json_string = json.dumps(data, ensure_ascii=False)
print(json_string) # {"name": "Алиса", "age": 25}
print(type(json_string)) # <class 'str'>
# loads() — строка → словарь (при получении данных из API)
raw = '{"name": "Боб", "balance": 500}'
parsed = json.loads(raw)
print(parsed["name"]) # Боб
print(type(parsed)) # <class 'dict'>
Что нельзя сохранить в JSON
# Функции → TypeError
data = {"func": print}
json.dump(data, file) # ❌ TypeError
# Объекты классов → TypeError
user = User("Алиса")
json.dump(user, file) # ❌ TypeError
# Решение: преобразовать в словарь
json.dump({"name": user.name}, file) # ✅
# Множества (set) → TypeError
data = {"numbers": {1, 2, 3}}
json.dump(data, file) # ❌ TypeError
# Решение: преобразовать в список
data = {"numbers": list({1, 2, 3})} # ✅
Паттерн: конфигурационный файл
import json
def load_config(filename="config.json"):
try:
with open(filename, "r", encoding="utf-8") as file:
return json.load(file)
except FileNotFoundError:
return {
"app_name": "MyApp",
"version": "1.0",
"debug": False,
"max_accounts": 10
}
config = load_config()
print(f"Приложение: {config['app_name']} v{config['version']}")
Частые ошибки
1. Забыл ensure_ascii=False:
# ❌ Кириллица превратится в \uXXXX
json.dump(data, file)
# ✅ Правильно
json.dump(data, file, ensure_ascii=False)
2. Сохранил объект класса напрямую:
# ❌ TypeError
json.dump(my_object, file)
# ✅ Сначала преобразуй в словарь
json.dump(my_object.__dict__, file)
Резюме
json.dump(data, file, indent=4, ensure_ascii=False)— сохранить в файлjson.load(file)— загрузить из файлаjson.dumps(data)— в строкуjson.loads(string)— из строки- Всегда используй
try/exceptпри загрузке - Объекты классов сохраняй как словари
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!