Работа с 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)

Полезные практики 🛠️

  1. Валидация JSON: Всегда проверяйте структуру данных перед обращением к ключам
  2. Обработка ошибок: Используйте try-except при работе с внешними JSON-данными
  3. Компактная запись: Для API-запросов используйте json.dumps(separators=(',', ':'))
  4. Сортировка ключей: 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 для валидации данных

Скрыть рекламу навсегда

🧠 Учёба без воды и зубрёжки

Закрытый Boosty с наработками опытного преподавателя.

Объясняю сложное так, чтобы щелкнуло.

🚀 Забрать доступ к Boosty