← Назад к вопросам

В чем разница между словарем и JSON?

1.0 Junior🔥 181 комментариев
#Python Core#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между словарем и JSON

Словарь (Dictionary) — структура данных Python

Словарь — это встроенная структура данных в Python для хранения пар ключ-значение. Это объект в памяти программы.

# Словарь в Python
user_dict = {
    'name': 'Иван',
    'age': 30,
    'email': 'ivan@example.com',
    'is_active': True,
    'tags': ['python', 'django', 'rest'],
    'profile': {
        'bio': 'Разработчик',
        'city': 'Москва'
    }
}

# Доступ к значениям
print(user_dict['name'])  # 'Иван'
print(user_dict['age'])   # 30
print(user_dict['tags'][0])  # 'python'

# Изменение
user_dict['age'] = 31
user_dict['phone'] = '+7-900-000-00-00'

# Типы значений: строки, числа, булевы, списки, другие словари, функции и т.д.
print(type(user_dict))  # <class 'dict'>

Особенности словаря:

  • Существует только в памяти программы
  • Может содержать любые Python объекты (функции, классы, объекты)
  • Изменяемый (mutable) — можно добавлять, удалять, изменять элементы
  • Упорядоченный (с Python 3.7+) — сохраняет порядок ключей
  • Быстрый доступ O(1)

JSON (JavaScript Object Notation) — формат данных

JSON — это текстовый формат для обмена данными. Это не структура данных конкретного языка, а стандартный формат, понимаемый всеми языками программирования.

{
  "name": "Иван",
  "age": 30,
  "email": "ivan@example.com",
  "is_active": true,
  "tags": ["python", "django", "rest"],
  "profile": {
    "bio": "Разработчик",
    "city": "Москва"
  }
}

Особенности JSON:

  • Текстовый формат (строка)
  • Стандартный формат для обмена данными между системами
  • Допускает только ограниченные типы (строки, числа, булевы, null, массивы, объекты)
  • Неизменяемый — это просто текст
  • Универсален для всех языков программирования

Соотношение между Python и JSON

# Python dict → JSON (сериализация)
user_dict = {'name': 'Иван', 'age': 30}
json_string = json.dumps(user_dict)
print(json_string)  # '{"name": "Иван", "age": 30}'
print(type(json_string))  # <class 'str'>

# JSON → Python dict (десериализация)
json_string = '{"name": "Иван", "age": 30}'
user_dict = json.loads(json_string)
print(user_dict)  # {'name': 'Иван', 'age': 30}
print(type(user_dict))  # <class 'dict'>

Ключевые различия

АспектСловарьJSON
Что этоСтруктура данных PythonТекстовый формат
ТипОбъект в памятиСтрока
СуществованиеТолько в программеВезде (файлы, сеть, БД)
ИзменяемостьMutable (можно менять)Immutable (просто текст)
Допустимые типыЛюбые Python объектыТолько базовые типы
КомментарииМожно в кодеНе допускаются
Порядок ключейСохраняетсяСохраняется
Функции/классыМожно хранитьНельзя
NaN, InfinityПоддерживаютсяНе поддерживаются

Практический пример: Web API

# Backend (Python)
from flask import Flask, jsonify
import json

app = Flask(__name__)

@app.route('/api/users/<int:user_id>')
def get_user(user_id):
    # Словарь в памяти программы
    user_dict = {
        'id': user_id,
        'name': 'Иван',
        'email': 'ivan@example.com',
        'roles': ['admin', 'user']
    }
    
    # Flask автоматически преобразует dict в JSON
    # (вызывает jsonify, который использует json.dumps)
    return jsonify(user_dict)

if __name__ == '__main__':
    app.run()
Отправленный в браузер ответ (JSON текст):
{
  "id": 1,
  "name": "Иван",
  "email": "ivan@example.com",
  "roles": ["admin", "user"]
}
# Frontend/Client (JavaScript/Python)
import requests
import json

# Получаем JSON текст от сервера
response = requests.get('http://localhost:5000/api/users/1')
json_text = response.text  # '{"id": 1, "name": "Иван", ...}'

# Преобразуем JSON в Python dict
user_dict = json.loads(json_text)  # Или response.json() в requests
print(user_dict['name'])  # 'Иван'

Типы данных в JSON vs Python

import json

# ✅ Поддерживаются JSON
valid_json_compatible = {
    'string': 'текст',
    'number': 42,
    'float': 3.14,
    'bool': True,
    'null': None,
    'array': [1, 2, 3],
    'object': {'nested': 'value'}
}

json_string = json.dumps(valid_json_compatible)
print(json_string)  # OK

# ❌ Не поддерживаются JSON
from datetime import datetime
from decimal import Decimal

invalid_json_compatible = {
    'date': datetime.now(),  # ❌ datetime не в JSON
    'decimal': Decimal('10.5'),  # ❌ Decimal не в JSON
    'function': lambda x: x * 2,  # ❌ функции не в JSON
    'set': {1, 2, 3},  # ❌ set не в JSON
}

try:
    json_string = json.dumps(invalid_json_compatible)
except TypeError as e:
    print(f'Ошибка: {e}')  # Object of type datetime is not JSON serializable

Сериализация комплексных типов

import json
from datetime import datetime
from decimal import Decimal

# Способ 1: Использовать custom encoder
class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()
        elif isinstance(obj, Decimal):
            return float(obj)
        return super().default(obj)

data = {
    'created_at': datetime.now(),
    'price': Decimal('99.99')
}

json_string = json.dumps(data, cls=CustomEncoder)
print(json_string)
# {"created_at": "2024-03-22T10:30:45.123456", "price": 99.99}

# Способ 2: Преобразовать перед сериализацией
data = {
    'created_at': datetime.now().isoformat(),
    'price': float(Decimal('99.99'))
}

json_string = json.dumps(data)
print(json_string)

Использование в Pydantic (FastAPI)

from pydantic import BaseModel
from datetime import datetime
from decimal import Decimal
from typing import Optional

class UserModel(BaseModel):
    id: int
    name: str
    email: str
    created_at: datetime
    balance: Decimal
    
    # Pydantic автоматически преобразует в JSON
    class Config:
        # Сохраняет timezone информацию
        json_encoders = {
            datetime: lambda v: v.isoformat(),
            Decimal: lambda v: float(v)
        }

# Создание из dict
user_dict = {
    'id': 1,
    'name': 'Иван',
    'email': 'ivan@example.com',
    'created_at': '2024-03-22T10:30:45',
    'balance': '99.99'
}

user = UserModel(**user_dict)

# Преобразование в JSON (для API ответа)
json_string = user.model_dump_json()
print(json_string)
# {"id": 1, "name": "Иван", "email": "ivan@example.com", "created_at": "2024-03-22T10:30:45", "balance": 99.99}

Вывод

  • Словарь — структура данных в памяти Python (dict)
  • JSON — текстовый формат для обмена данными между системами
  • json.dumps() — преобразует dict в JSON строку (сериализация)
  • json.loads() — преобразует JSON строку в dict (десериализация)
  • JSON поддерживает только базовые типы (строки, числа, булевы, null, массивы, объекты)
  • Для комплексных типов (datetime, Decimal) нужны custom encoders