📝 Python

JSON: Сохранение данных

P
Автор
PyLand Team
📅
Опубликовано
03.04.2026
⏱️
Время чтения
3 мин
👁️
Просмотров
467
🌿
Уровень
Средний

Цель: Научиться сохранять и загружать данные в формате 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)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

Что такое ORM

ORM (Object-Relational Mapping) — технология, позволяющая работать с базой данных через объекты Python вместо SQL.

📅 30.06.2026 👁️ 363
📝

CSV: Работа с таблицами

CSV (Comma-Separated Values) — текстовый формат для хранения табличных данных. Открывается в Excel и Google...

📅 03.04.2026 👁️ 435
📝

ООП: Программируй как создатель миров 🌍

Представь: ты создаёшь игру про зомби-апокалипсис. Нужны зомби, люди, оружие. Каждый зомби имеет имя, здоровье,...

📅 03.04.2026 👁️ 413