Тесты Пообщаться с GPT Протестировать код
Программирование Аналитика Дизайн Маркетинг Управление проектами
31 Мар 2023
7 мин
41572

Как работать с модулем JSON в Python

Пройдите тест, узнайте какой профессии подходите

JSON часто применяют, когда разрабатывают API и веб-приложения.

Основной принцип работы интернета — обмен данными. Они бывают разных видов, например файл, строка или число. Есть структура данных, с которой можно быстро и просто воссоздавать объекты и обмениваться этими данными по сети, — JSON.

JSON в Python

JSON — это строка со словарем. Это байтовая последовательность. Вы можете отправить строку по сети приложению, а в нём воссоздать полученную структуру в объекты языка.

💡 Пример JSON:

код

Структура JSON

JSON работает на двух основных структурах:

  1. Коллекции пар «ключ — значение» (аналогично словарям в Python):
    {
    "name": "Alice",
    "age": 30,
    "is_student": false
    }
    

    Ключи должны быть строками — в двойных кавычках «». Значения могут быть строками, числами, булевыми (true/false), null, массивами или другими объектами.

  2. Упорядоченные списки значений (аналогично спискам в Python):
    [«apple», «banana», «cherry»].
    В массивах могут быть любые допустимые JSON-значения, в том числе вложенные объекты и массивы.
    Пример сложной структуры:

    {
    "user": {
    "id": 1,
    "name": "John Doe",
    "roles": ["admin", "editor"],
    "metadata": {
    "created_at": "2023-01-01",
    "active": true
    }
    }
    }
    

В Python JSON выглядит как:

  • объекты → dict;
  • массивы → list;
  • строки → str;
  • числа → int или float;
  • true/false → True/False;
  • null → None.

Нужно понимать структуры JSON, чтобы корректно работать с методами:

  • json.loads() — чтение JSON;
  • json.dumps() — запись JSON.

Основные операции с JSON в Python

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

Загрузка JSON из строки

Используйте json.loads(), чтобы преобразовать JSON-строку в Python-объект:

import json
json_str = '{"name": "Alice", "age": 25}'
data = json.loads(json_str) # → {'name': 'Alice', 'age': 25}

Запись JSON в строку

Метод json.dumps() преобразует Python-объект в JSON-строку:

data = {"name": "Bob", "is_active": True}
json_str = json.dumps(data) # → '{"name": "Bob", "is_active": true}'

Загрузка JSON из файла

Чтение JSON из файла с помощью json.load():

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

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

Сохранить Python-объект в файл в формате JSON — json.dump() — можно так:

data = {"key": "value"}
with open("output.json", "w", encoding="utf-8") as file:
json.dump(data, file, indent=4) # indent для красивого форматирования

Сериализация и десериализация

В Python много библиотек, чтобы работать с JSON, но мы рассмотрим встроенную библиотеку JSON Python. С ней можно приводить любые структуры данных к JSON-объекту — вплоть до пользовательских классов. А из него получать совместимую для работы в Python сущность — объект языка.

Разобраться в Python вы сможете на курсе «Python-разработчик». Преподаватели объяснят все нюансы доступным языком, а вы выполните практические задания. Например, разработаете виджет банковских операций. После учебы у вас будет готовое портфолио и диплом о профессиональной переподготовке.

Упаковка объектов в байтовую последовательность называется сериализацией, а распаковка байтов в объекты языка программирования, приведение последовательности назад к типам и структурам — десериализацией.

Нужно переводить данные в байты, чтобы отправлять их по сети или локально другому приложению: другой формат передать невозможно. Вот так преобразовывают данные из объектов Python в JSON и обратно:

код

Функции

С Dumps можно создать JSON-строку из переданного в нее объекта. С Loads — преобразовать строку назад в объекты языка.

Dump и load используют, чтобы сохранить результат в файл или воссоздать объект. Работают они похожим образом, но нужно передавать специальный объект для работы с файлом — filehandler.

код

Примеры

Вот несколько примеров сериализации и десериализации:

  1. Сериализация (Python → JSON).
    Преобразование объектов Python в JSON-формат:

    import json
    # Python-словарь
    data = {
    "name": "Anna",
    "age": 28,
    "courses": ["Math", "Physics"],
    "is_student": True,
    "graduated": None
    }
    # Сериализация в JSON-строку
    json_str = json.dumps(data, indent=4) # indent для красивого форматирования
    print(json_str)

    Вывод:

    {
    "name": "Anna",
    "age": 28,
    "courses": ["Math", "Physics"],
    "is_student": true,
    "graduated": null
    }

  2. Десериализация (JSON → Python).

    Преобразование JSON-строки обратно в объект Python:

    json_data = '''
    {
    "name": "Alex",
    "age": 35,
    "married": false,
    "children": ["Mia", "Tom"]
    }
    '''
    # Десериализация в Python-словарь
    python_dict = json.loads(json_data)
    print(python_dict)
    

    Вывод:

    {
    'name': 'Alex',
    'age': 35,
    'married': False,
    'children': ['Mia', 'Tom']
    }
    
  3. Работа с файлами.
    # Запись JSON в файл (сериализация)
    with open("user.json", "w") as file:
    json.dump(data, file, indent=2)
    # Чтение JSON из файла (десериализация)
    with open("user.json", "r") as file:
    loaded_data = json.load(file)
    print(loaded_data)
    

Как работать с пользовательскими объектами

Пользовательские классы не относятся к JSON-сериализуемым. Это значит, что просто применить к ним функции dumps, loads или dump и load не получится:

код

🚀 Написать функцию

Чтобы сериализовать пользовательский объект в JSON-структуру данных, нужен аргумент default. Указывайте вызываемый объект, то есть функцию или статический метод.

Чтобы получить аргументы класса с их значениями, нужна встроенная функция __dict__, потому что любой класс — это словарь со ссылками на значения по ключу.

Чтобы сериализовать аргументы класса и их значения в JSON, напишите функцию:

код

Но можно создать отдельную функцию и указать ее как аргумент:

код
❗ Мы добавили название класса в получаемую структуру. Так можно безошибочно понять, сущность какого класса десериализовать в объект.

Более подробно писать функции вы научитесь на курсе «Python-разработчик». А еще сами сделаете сервис проверки файлов с возможностью регистрации, отправки уведомлений и формирования отчета о задачах.

🚀 Создать расширение классов

Такого же результата добьетесь, если примените расширения специальных классов библиотеки:

код

Такой подход можно использовать и тогда, когда класс состоит из нескольких других.

🚀 Применить паттерн «Адаптер»

Идея в том, чтобы написать класс, который приводит к JSON пользовательские объекты и восстанавливает их. Определите класс фигуры, формы и цвета:

Напишите класс, который будет приводить объекты фигуры к JSON, а из JSON воссоздавать полученный объект:

код

Протестируйте решение:

код

Вывод терминала:

код

Отображение объектов:

код

Отображение JSON:

код

Отображение восстановленных объектов:

Изучайте Python на онлайн-курсе от Skypro «Python-разработчик». Программа рассчитана на новичков без опыта программирования и технического образования. Курс проходит в формате записанных коротких видеолекций. Будет много проверочных заданий и мастер-классов. В конце каждой недели — живая встреча с экспертами разработки для ответов на вопросы и разбора домашек.

Главное о работе с JSON в Python

  • JSON — это стандарт обмена данными. С ним легко сериализовать и десериализовать объекты.
  • Стандарт часто применяют, когда разрабатывают API и веб-приложения.
  • Для сериализации и десериализации объектов в строку или из строки используйте функции json.dumps и json.loads. Из файлов — json.dump и json.load.
  • Сериализовать можно любую пользовательскую структуру. Для этого создайте функцию, напишите расширение классов JSONEncoder/JSONDecoder или свою реализацию «Адаптера».

Добавить комментарий