Формат JSON: структура и работа в Python

Формат JSON: структура и работа в Python REST API

Привет! JSON — это самый популярный формат обмена данными в веб-разработке. Он используется в API, конфигурациях, хранении данных. В Python работать с JSON очень просто благодаря встроенному модулю json.

В этой статье мы разберём:

  • Что такое JSON
  • Структура JSON
  • Типы данных в JSON
  • Модуль json в Python
  • Сериализация и десериализация
  • Работа с файлами JSON

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный Python
  • Базовое понимание словарей и списков

Совет: JSON — это текстовый формат, который легко читается и человеком, и машиной.

Основная часть

Что такое JSON

JSON (JavaScript Object Notation) — это лёгкий формат обмена данными. Он основан на синтаксисе JavaScript, но не зависит от языка.

JSON-данные — это всегда строка.

Совет: JSON похож на словари Python, но со своими правилами.

Структура JSON

JSON поддерживает две основные структуры:

1. Объект (аналог словаря Python):

{
    "name": "Анна",
    "age": 25,
    "is_active": true
}

2. Массив (аналог списка Python):

["apple", "banana", "cherry"]

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

JSONPython
stringstr
numberint / float
true / falseTrue / False
nullNone
arraylist
objectdict

Модуль json в Python

Основные функции:

ФункцияНазначение
json.dumps()Превращает Python-объект в JSON-строку
json.loads()Превращает JSON-строку в Python-объект
json.dump()Записывает JSON-строку в файл
json.load()Читает JSON из файла

Сериализация (json.dumps())

Превращает Python-объект в JSON-строку.

import json

data = {
    "name": "Анна",
    "age": 25,
    "is_active": True,
    "scores": [95, 87, 92],
    "address": None
}

json_string = json.dumps(data, ensure_ascii=False, indent=4)
print(json_string)

Результат:

{
    "name": "Анна",
    "age": 25,
    "is_active": true,
    "scores": [95, 87, 92],
    "address": null
}

Совет: ensure_ascii=False — для поддержки русского языка. indent=4 — для красивого форматирования.

Десериализация (json.loads())

Превращает JSON-строку в Python-объект.

import json

json_string = '{"name": "Анна", "age": 25, "is_active": true}'

data = json.loads(json_string)
print(data)
print(type(data))   # <class 'dict'>
print(data["name"]) # Анна

Работа с JSON-файлами

Запись в файл:

import json

data = {
    "name": "Анна",
    "age": 25,
    "city": "Москва"
}

with open("data.json", "w", encoding="utf-8") as file:
    json.dump(data, file, ensure_ascii=False, indent=4)

Чтение из файла:

import json

with open("data.json", "r", encoding="utf-8") as file:
    data = json.load(file)
    print(data)

Объекты с кастомными типами

import json
from datetime import datetime

# Создаём объект
data = {
    "name": "Анна",
    "created_at": datetime.now()
}

# Ошибка! datetime не сериализуется
# json.dumps(data)

# Решение: преобразуем в строку
def serialize_datetime(obj):
    if isinstance(obj, datetime):
        return obj.isoformat()
    raise TypeError(f"Объект {obj} не сериализуем")

json_string = json.dumps(data, default=serialize_datetime, indent=4)
print(json_string)

Пример из реальной жизни

API-клиент:

import json
import requests

# Отправка JSON
def create_user(name, age, city):
    data = {
        "name": name,
        "age": age,
        "city": city
    }
    response = requests.post(
        "https://api.example.com/users",
        json=data
    )
    return response.json()

# Получение JSON
response = requests.get("https://api.example.com/users")
users = response.json()
print(users)

# Сохранение в файл
with open("users.json", "w") as file:
    json.dump(users, file, indent=4)

# Чтение из файла
with open("users.json", "r") as file:
    users = json.load(file)

Задачи для закрепления

Задача 1. Преврати словарь {"name": "Иван", "age": 30} в JSON-строку.

Задача 2. Преврати JSON-строку '{"city": "Москва", "temp": 22.5}' в словарь.

Задача 3. Запиши словарь в JSON-файл.

Задача 4. Прочитай JSON-файл.

Задача 5. Что произойдёт, если попытаться сериализовать datetime?

Ответы:

Задача 1.

import json
data = {"name": "Иван", "age": 30}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)   # {"name": "Иван", "age": 30}

Задача 2.

json_str = '{"city": "Москва", "temp": 22.5}'
data = json.loads(json_str)
print(data)   # {'city': 'Москва', 'temp': 22.5}

Задача 3.

with open("data.json", "w", encoding="utf-8") as file:
    json.dump(data, file, ensure_ascii=False, indent=4)

Задача 4.

with open("data.json", "r", encoding="utf-8") as file:
    data = json.load(file)

Задача 5.

# Будет ошибка TypeError

Нюансы и подводные камни

  • JSON поддерживает только строки, числа, булевы, null, массивы и объекты.
  • Python-объекты (datetime, set, Decimal) не сериализуются по умолчанию.
  • json.dumps() сериализует, json.loads() десериализует.
  • json.dump() и json.load() работают с файлами.
  • ensure_ascii=False — для поддержки Unicode.
  • indent — для красивого форматирования.
  • Кастомные типы требуют обработки через default или кастомные кодировщики.

Частые ошибки и как их избежать

Ошибка 1: Попытка сериализовать datetime

Используй default параметр или преобразуй в строку.

Ошибка 2: Неправильная работа с файлами

Используй with open() для безопасной работы.

Ошибка 3: Путаница между json.dumps() и json.dump()

dumps() — в строку, dump() — в файл.

Шпаргалка

Что нужноКак пишется
Сериализацияjson.dumps(data)
Десериализацияjson.loads(json_str)
Запись в файлjson.dump(data, file)
Чтение из файлаjson.load(file)
Красивое форматированиеindent=4
Поддержка Unicodeensure_ascii=False

Заключение

Сегодня мы:

  • Узнали, что такое JSON
  • Изучили структуру и типы данных
  • Научились работать с модулем json
  • Примеры сериализации и десериализации

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×