img
img
25 апреля 2022
25 апреля 2022
9 мин
36

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

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

img
Автор статьи
Анастасия Хамидулина
Копирайтер, редактор
img

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

JSON в Python

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

💡 Пример JSON:


{

    "kwarg1": "value_1",

    "kwarg2": "value_2",

    "kwarg3": "value_3",

    "additional": ["value_4", "value_5", "value_6", ]

}

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

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

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

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


>>> # импортируем библиотеку

>>> import json

>>> 

>>> # объявляем переменные

>>> string = "Some test string"

>>> integer = 211

>>> array = [1, 2, 3, 4, 5]

>>> 

>>> # создаем словарь

>>> mydict = {"title": string, "code": integer, "data": array}

>>> 

>>> # сериализуем его в JSON-структуру, как строку

>>> x = json.dumps(mydict)

>>> x

'{"title": "Some test string", "code": 211, "data": [1, 2, 3, 4, 5]}'

>>> 

>>> # проводим десериализацию JSON-объекта

>>> y = json.loads(x)

>>> y

{'title': 'Some test string', 'code': 211, 'data': [1, 2, 3, 4, 5]}

>>> 

>>> y["title"]

'Some test string'

>>> 

Функции

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

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


>>> import json # импортируем библиотеку

>>> 

>>> # создаем filehandler с помощью контекстного менеджера

>>> with open("data.json", "w") as fh:

...     json.dump([1, 2, 3, 4, 5], fh) # записываем структуру в файл

... 

>>> 

>>> # открываем тот же файл, но уже на чтение

>>> with open("data.json", "r") as fh:

...     json.load(fh) # загружаем структуру из файла

... 

[1, 2, 3, 4, 5]

>>> 

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

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


>>> # создаем пользовательский класс

>>> class Test:

...     def __init__(self, title, body):

...         self.title = title

...         self.body = body

... 

>>> # создаем экземпляр класса

>>> t = Test("Some string", "Here is a bit more text, but still isn't enough")

>>> 

>>> # пытаемся сериализовать его в JSON, но...

>>> json.dumps(t)

>>> # получаем ошибку TypeError, что класс несериализуем

>>> 

Решить эту проблему можно тремя способами.

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

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

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

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


>>> # используем анонимную функцию (лямбду), которая

>>> # в качестве сериализуемых данных указывает полученный __dict__ объекта

>>> json.dumps(t, default=lambda x: x.__dict__)

'{"title": "Some string", "body": "Here is a bit more text, but still isn\'t enough"}'

>>> 

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


>>> def to_json(obj):

...     if isinstance(obj, Test):

...         result = obj.__dict__

...         result["className"] = obj.__class__.__name__

...         return result

... 

>>> json.dumps(t, default=to_json)

'{"title": "Some string", "body": "Here is a bit more text, but still isn\'t enough", "className": "Test"}'

>>> 

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

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

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


>>> class TestEncoder(json.JSONEncoder):

...     def default(self, o):

...         return {"TITLE": o.title, "BODY": o.body, "CLASSNAME": o.__class__.__name__}

... 

>>> x = json.dumps(t, cls=TestEncoder)

>>> x

'{"TITLE": "Some string", "BODY": "Here is a bit more text, but still isn\'t enough"}'

>>> 

>>> y = json.loads(x)

>>> y

{'TITLE': 'Some string', 'BODY': "Here is a bit more text, but still isn't enough", 'CLASSNAME': 'Test'}

>>> 

>>> y["TITLE"]

'Some string'

>>> 

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

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

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


class Figure:

    def __init__(self, title, form, color):

        self.title = title

        self.form = form

        self.color = color

    def __str__(self):

        return f"Figure: {self.title}, {repr(self.form)}, {repr(self.color)}"

class Form:

    def __init__(self, name):

        self.name = name

    def __repr__(self):

        return f"<Form: {self.name}>"

class Color:

    def __init__(self, name):

        self.name = name

    def __repr__(self):

        return f"<Color: {self.name}>"

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


class JSONDataAdapter:

    @staticmethod

    def to_json(o):

        if isinstance(o, Figure):

            return json.dumps({

              "title": o.title,

              "form": o.form.name,

              "color": o.color.name,

            })

    @staticmethod

    def from_json(o):

        o = json.loads(o)

        try:

            form = Form(o["form"])

            color = Color(o["color"])

            figure = Figure(o["title"], form, color)

            return figure

        except AttributeError:

            print("Неверная структура")

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


if __name__ == '__main__':

    # создадим несколько цветов

    black = Color("Black")

    yellow = Color("Yellow")

    green = Color("Green")

    # несколько форм

    rountt = Form("Rounded")

    square = Form("Squared")

    # объекты фигур

    figure_one = Figure("Black Square", form=square, color=black)

    figure_two = Figure("Yellow Circle", form=rountt, color=yellow)

    print(“Отображение объектов”)

    print(figure_one)

    print(figure_two)

    print()

    # преобразуем данные в JSON

    jone = JSONDataAdapter.to_json(figure_one)

    jtwo = JSONDataAdapter.to_json(figure_two)

    print(“Отображение JSON”)

    print(jone)

    print(jtwo)

    print()

    # восстановим объекты

    restored_one = JSONDataAdapter.from_json(jone)

    restored_two = JSONDataAdapter.from_json(jtwo)

    print(“Отображение восстановленных объектов”)

    print(restored_one)

    print(restored_two)

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

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


Figure: Black Square, <Form: Squared>, <Color: Black>

Figure: Yellow Circle, <Form: Rounded>, <Color: Yellow>

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


{"title": "Black Square", "form": "Squared", "color": "Black"}

{"title": "Yellow Circle", "form": "Rounded", "color": "Yellow"}

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


Figure: Black Square, <Form: Squared>, <Color: Black>

Figure: Yellow Circle, <Form: Rounded>, <Color: Yellow>

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

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

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

img
Подпишитесь на рассылку, чтобы Не упустить что-нибудь новое
Просто и понятно о том, как получить новую профессию


    Дадим нужные знания и поможем получить работу!
    Регистрируйтесь на курс и учитесь у экспертов-практиков.
    Профессия
    за 10 месяцев
    Python-разработчик
    • Программа соответствует требованиям к вакансиям работодателей
    • Много практики в среде коммерческой разработки
    • Под силу даже если у вас нет опыта в IT
    • Всего 11 часов в неделю
    2973 ₽/мес.
    Ещё по теме
    img
    Программирование
    IT-компания — это не только Google

    Рассказываем про «Тинькофф», «Билайн» и другие компании.

    16 мая 2022
    2 мин
    карьера
    img
    Программирование
    Как составить и оформить баг-репорт

    Указывайте в отчете только одну ошибку, прикладывайте скрины, сообщения и коды.

    04 мая 2022
    6 мин
    баг-репорт
    img
    Программирование
    Как работать со списками в Python

    Учимся добавлять и изменять элементы, объединять и копировать списки.

    02 мая 2022
    5 мин
    python
    списки
    img
    Программирование
    Цикл for в Java: что это, как с ним работать

    Конструкция, чтобы много раз выполнять один и тот же участок кода.

    25 апреля 2022
    6 мин
    java
    циклы
    языки программирования
    img
    Программирование
    Как IT-специалисту из России найти работу за рубежом в 2022 году

    Есть сервисы, платформы и телеграм-каналы с вакансиями по всему миру.

    21 апреля 2022
    6 мин
    востребованные профессии
    img
    Программирование
    Что такое HTML: основные теги

    С помощью HTML структурируют страницу на сайте, добавляют картинки, таблицы, списки.

    16 апреля 2022
    6 мин
    html (hypertext markup language)p Language)
    верстка сайтов
    img
    Программирование
    Как работает цикл for в Python

    Цикл for используют, когда количество повторов известно заранее.

    14 апреля 2022
    5 мин
    python
    циклы
    языки программирования
    img
    Программирование
    Комьюнити для разработчика

    Есть комьюнити на платформах, под эгидой компаний или самоорганизующиеся.

    07 апреля 2022
    6 мин
    общение
    сообщество
    img
    Программирование
    Гайд: как определить, какое направление в IT тебе подходит

    Обязанности и зарплата аналитика, Python- и Java-разработчиков и не только.

    01 апреля 2022
    9 мин
    выбор профессии
    гуманитарий в IT
    img
    Программирование
    Правильное питание на удаленке. Почему это важно?

    Правильное питание — это не о жестких диетах и полном отказе от любимых продуктов.

    01 апреля 2022
    7 мин
    удаленная работа
    img
    Программирование
    Как я нашла время на учебу, когда времени не было совсем

    Благодаря методу «круга-пирога» увидите свое время и возьмете его под контроль.

    30 марта 2022
    7 мин
    дистанционное обучение
    домашняя работа
    самоорганизация
    img
    Программирование
    9 причин, почему не получается внедрять полезные привычки

    Ищите мотивацию, хвалите себя, визуализируйте план и результат.

    30 марта 2022
    8 мин
    постановка цели
    самоорганизация
    img
    Программирование
    Как больше успевать: зачем есть по одной лягушке в день и как справиться со слоном

    Лягушки — небольшие, но неприятные дела, слоны — долговременные задачи.

    30 марта 2022
    2 мин
    самоорганизация
    эффективность
    img
    Программирование
    Как поставить цель и не бросить на полпути

    Когда ставите цель, отталкивайтесь от проблемы и конкретизируйте решение.

    30 марта 2022
    6 мин
    постановка цели
    самоорганизация
    img
    Программирование
    Кто такой менеджер проектов, чем занимается и как им стать

    Этот специалист контролирует все этапы проекта и приводит его к успеху.

    30 марта 2022
    8 мин
    управление проектами
    img
    Программирование
    Как не угробить здоровье на удаленке

    Советы всем удаленщикам — больше двигаться, делать зарядку, разминку для глаз.

    30 марта 2022
    9 мин
    удаленная работа
    img
    Программирование
    Junior, Middle, Senior в разработке — кто есть кто и как перейти на уровень выше

    Junior зарабатывает от 40 000 ₽, Middle от 100 000 ₽, а Senior от 250 000 ₽ и выше.

    29 марта 2022
    12 мин
    junior
    middle
    senior
    img
    Программирование
    Как банковская служащая в 32 года с нуля перешла в IT и в 40 открыла свою компанию по разработке онлайн-игр

    Совет от героини: сделайте первый шаг, дальше будет проще; учитесь и идите вперед.

    29 марта 2022
    14 мин
    смена профессии
    смена сферы
    img
    Программирование
    Пять приложений, чтобы не отвлекаться от учебы и работы

    Фишки и стоимость Forest, WaterDo, SleepTown, Alarmy, Pomodoro Timer Lite.

    29 марта 2022
    5 мин
    самоорганизация
    img
    Программирование
    Самый краткий гид по специализациям программистов

    Программист fullstack получает до 550 000 ₽, а на тестировщика учатся 4–15 мес.

    29 марта 2022
    3 мин
    backend-разработка
    c++
    frontend-разработчик
    java-разработчик
    востребованные профессии
    инженер по тестированию
    img
    Программирование
    Язык SQL: что это такое и зачем он нужен

    SQL используют в банках, торговле, перевозках: везде, где много информации.

    29 марта 2022
    7 мин
    mysql
    базы данных
    img
    Программирование
    Как освоить c нуля IT-профессию и перейти на новую работу без опыта

    Сначала поставьте цель: выберите сферу и определите, кем видите себя через 10 лет.

    29 марта 2022
    6 мин
    выбор профессии
    смена сферы
    img
    Программирование
    Словарь IT-сленга

    Термины разработки, Scrum, неформального общения, организационных процессов.

    29 марта 2022
    13 мин
    сленг
    словарь
    img
    Программирование
    Подборка: 33 книги и подкаста для начинающих программистов

    Узнаете о работе программиста и поймете, как писать хороший код.

    28 марта 2022
    10 мин
    книга
    подкаст
    img
    Программирование
    Хакнуть мозг: как современные знания помогают мозгу развиваться и учиться

    Мозг меняется всю жизнь. Мы можем на него влиять: изучать новое, развивать навыки.

    28 марта 2022
    8 мин
    развитие мозга
    img
    Программирование
    Как совмещать работу, учебу, семью и быт: рассказ будущего тестировщика

    Помогает планирование, вера в то, что реально изменить жизнь, поддержка семьи.

    28 марта 2022
    8 мин
    курс обучения
    личная история
    онлайн-образование
    смена профессии
    тестирование
    img
    Программирование
    Что такое CSS и как с ним работать

    С помощью CSS задают цвет, размеры, анимацию, адаптируют сайт под устройства.

    16 марта 2022
    9 мин
    css
    img
    Программирование
    Как создать телеграм-бота на Python

    Python — самый популярный язык программирования в феврале 2022 года.

    16 марта 2022
    9 мин
    python
    img
    Программирование
    Какие профессии в IT подойдут гуманитарию

    Гуманитарию подойдут профессии тестировщика, веб-дизайнера и не только.

    15 марта 2022
    9 мин
    выбор профессии
    карьера
    img
    Программирование
    Frontend или backend: чем отличаются и какой вид разработки выбрать

    Фронтендер создает интерфейс продукта, бэкендер работает с серверной частью.

    15 марта 2022
    7 мин
    backend-разработка
    frontend
    img
    Программирование
    Кто такой Java-разработчик, чем занимается и как им стать

    Обязанности Java-разработчика — писать код, тестировать и улучшать его.

    15 марта 2022
    7 мин
    java
    java-разработчик
    карьера
    img
    Программирование
    Что такое IT-сфера и почему она сейчас так популярна

    IT-отрасль привлекает удаленкой, карьерным ростом, высоким доходом.

    04 марта 2022
    7 мин
    it
    карьера
    img
    Программирование
    Как установить Python на компьютер и начать на нём писать

    Воспользуйтесь Google Colab, онлайн-интерпретаторами или скачайте Python.

    04 марта 2022
    4 мин
    python
    языки программирования
    img
    Программирование
    Как создать приложение для Андроид самостоятельно с нуля: инструкция

    Используйте конструкторы no-code, Java или Kotlin, Android Studio.

    04 марта 2022
    8 мин
    андроид
    разработка
    img
    Программирование
    Postman: как пользоваться программой для тестирования API

    Бесплатный сервис позволяет писать тесты, поддерживает разные типы API.

    04 марта 2022
    6 мин
    api
    postman
    img
    Программирование
    Google Colab: что это такое и как с ним работать

    Colab используют, чтобы создавать код на Python прямо в браузере.

    04 марта 2022
    4 мин
    google colab
    img
    Программирование
    Как перейти в разработчики из другой профессии

    Освоить новую профессию реально с нуля в любом возрасте, главное — мотивация.

    03 марта 2022
    8 мин
    карьера
    разработка
    img
    Программирование
    Как помочь ребенку выбрать профессию

    Не выбирайте по принципу «чем проще, тем лучше» и уважайте желания ребенка.

    03 марта 2022
    7 мин
    карьера
    родителям
    img
    Программирование
    Нужно ли высшее образование программисту: сравниваем все «за и «против»

    Важнее опыт и проекты в портфолио, но иногда высшее образование все-таки нужно.

    02 марта 2022
    5 мин
    образование
    img
    Программирование
    Стоит ли переходить на удаленку: плюсы и минусы

    Сегодня удаленка доступна для разных сфер: ИТ, маркетинг, сервис, продажи.

    02 марта 2022
    6 мин
    удаленка
    img
    Программирование
    Какой язык программирования выбрать новичку

    Выбирайте по уровню спроса у работодателей и направлению в программировании.

    24 февраля 2022
    7 мин
    языки программирования
    img
    Программирование
    Фильмы про программистов: лучшие фильмы и сериалы про компьютерных гениев

    20 фильмов и сериалов для тех, кому интересен мир информационных технологий.

    24 февраля 2022
    7 мин
    фильмы
    img
    Программирование
    Фронтенд-разработчик: кто это такой и как им стать с нуля

    Frontend-разработчик создает внешнюю — пользовательскую часть веб-ресурса.

    24 февраля 2022
    8 мин
    frontend
    карьера
    img
    Программирование
    Backend-разработчик: кто это такой и чем он занимается

    Backend-разработчик отвечает за внутреннюю — серверную сторону веб-ресурса.

    24 февраля 2022
    9 мин
    backend
    карьера
    img
    Программирование
    Что такое спринты в программировании и как их выполнять

    Спринты используют в долгих проектах и сложных продуктах.

    24 февраля 2022
    5 мин
    agile
    scrum
    спринты в программировании
    img
    Программирование
    Как начать изучать Python

    Преимущества Python — понятный синтаксис и читаемость, готовые библиотеки.

    24 февраля 2022
    9 мин
    python
    языки программирования
    img
    Программирование
    Jupyter Notebook: что это такое и как им пользоваться

    Jupyter-ноутбуки применяют для визуализации данных в big data и data science.

    24 февраля 2022
    7 мин
    jupyter notebook
    python
    разработка
    img
    Программирование
    Как развить soft skills

    Soft skills помогают развивать компетенции, осваивать новые тенденции в работе.

    24 февраля 2022
    11 мин
    soft skills
    саморазвитие
    img
    Программирование
    Как начать изучать Java

    На Java разрабатывают всё: от приложений и ПО до технологий Big Data.

    24 февраля 2022
    7 мин
    java
    java-разработчик
    языки программирования