← Назад к вопросам
В чем разница между словарем и 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