Работа с JSON-данными: чтение, запись, преобразование
Почему JSON — это круто? 🤩
JSON (JavaScript Object Notation) — это универсальный формат данных, который стал стандартом для обмена информацией между серверами и клиентами. Он простой, читаемый и поддерживается практически всеми языками программирования, включая Python!
Пример JSON-данных:
{
"name": "Алексей",
"age": 28,
"skills": ["Python", "SQL", "Django"],
"is_developer": true
}
Подключение модуля json 📦
В Python работа с JSON начинается с импорта встроенного модуля json:
import json
Этот модуль предоставляет все необходимое:
- json.loads() — чтение JSON из строки
- json.dumps() — преобразование Python-объекта в JSON-строку
- json.load() — чтение JSON из файла
- json.dump() — запись JSON в файл
Чтение JSON из строки 📖
Допустим, у нас есть JSON-строка:
user_json = '{"name": "Мария", "age": 25, "city": "Москва"}'
Преобразуем её в Python-словарь:
user_data = json.loads(user_json)
print(user_data["name"]) # Выведет: Мария
🔍 Важно: JSON-ключи всегда в кавычках, а значения могут быть строками, числами, булевыми значениями, списками или вложенными объектами.
Запись Python-объектов в JSON ✍️
Теперь сделаем обратное преобразование — из Python-словаря в JSON-строку:
python_dict = {
"product": "Ноутбук",
"price": 899.99,
"in_stock": True,
"accessories": ["Чехол", "Мышка", "Клавиатура"]
}
json_string = json.dumps(python_dict, indent=4, ensure_ascii=False)
print(json_string)
Параметры:
- indent=4 — красивое форматирование с отступами
- ensure_ascii=False — корректное отображение кириллицы
Работа с JSON-файлами 💾
Чтение из файла
with open('data.json', 'r', encoding='utf-8') as file:
data = json.load(file)
Запись в файл
with open('output.json', 'w', encoding='utf-8') as file:
json.dump(data, file, indent=2)
📌 Профессиональный совет: Всегда указывайте кодировку utf-8 при работе с файлами в Python!
Обработка сложных структур 🧩
JSON отлично работает с вложенными структурами. Рассмотрим пример с API-ответом:
api_response = {
"status": "success",
"data": {
"users": [
{"id": 1, "name": "Иван"},
{"id": 2, "name": "Ольга"}
],
"count": 2
}
}
# Доступ к вложенным данным
first_user_name = api_response["data"]["users"][0]["name"]
Кастомные преобразования 🔄
Иногда нужно сериализовать объекты, которые json.dumps() не поддерживает по умолчанию (например, datetime). Решение — параметр default:
from datetime import datetime
def custom_serializer(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError("Type not serializable")
event = {
"title": "Python Meetup",
"date": datetime.now()
}
json.dumps(event, default=custom_serializer)
Полезные практики 🛠️
- Валидация JSON: Всегда проверяйте структуру данных перед обращением к ключам
- Обработка ошибок: Используйте
try-exceptпри работе с внешними JSON-данными - Компактная запись: Для API-запросов используйте
json.dumps(separators=(',', ':')) - Сортировка ключей:
json.dumps(sort_keys=True)для стабильного вывода
try:
data = json.loads(maybe_json)
except json.JSONDecodeError as e:
print(f"Ошибка в JSON: {e}")
Реальный пример: парсинг API 🌐
Давайте напишем код для работы с реальным API (например, погодным сервисом):
import requests
import json
response = requests.get("https://api.openweathermap.org/data/2.5/weather?q=Moscow")
weather_data = json.loads(response.text)
print(f"Погода в Москве: {weather_data['weather'][0]['description']}")
print(f"Температура: {weather_data['main']['temp'] - 273.15:.1f}°C")
Выводы и дальнейшие шаги 🎯
Теперь вы умеете: - Преобразовывать JSON ↔ Python-объекты - Работать с JSON-файлами - Обрабатывать сложные структуры данных - Решать реальные задачи с использованием JSON
Для углубленного изучения рекомендую:
1. Официальную документацию модуля json
2. Работу с альтернативными парсерами (ujson, orjson) для повышения производительности
3. Изучение формата JSON Schema для валидации данных