Как сериализовать и десериализовать JSON в Python

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

JSON является одним из самых распространённых форматов хранения данных. Сегодня поговорим о работе с JSON в Python. Читайте далее, как соотносятся словари и JSON, сериализация и десериализация, в чем разница между функциями dump и dumps, load и loads в Python.

JSON что это

JSON расшифровывается как JavaScript Object Notation. Эта нотация берет своё начало с записи объектов в языке JavaScript. С момента своего создания JSON быстро стал де-факто стандартом для обмена информацией. Если вы собираете информацию в Интернете, применяя методы Web Mining или какой-нибудь API, то, вероятно, данные будут храниться в этом формате. Также некоторые базы данных работают с JSON, например, MongoDB. Кто знаком с Python не найдут JSON чем-то сложным по нескольким причинам:

  1. В Python есть стандартная библиотека, чьи функции легко запоминаются.
  2. Нотация JSON схожа со словарями (dict):
    {
        "firstName": "Oleg",
        "lastName": "Brusnika",
        "hobbies": ["programming", "reading", "dancing"],
        "age": 45,
        "children": [
            {
                "firstName": "Polina",
                "age": 6
            },
            {
                "firstName": "Anna",
                "age": 8
            }
        ]
    }

Сериализация JSON, или в чем разница между dump и dumps

Процесс кодирования данных в необходимый формат обычно называется сериализацией. Мы же кодируем в JSON. Допустим, что есть словарь, который нужно сериализовать в JSON.

data = {
    "president": {
        "name": "Joe Biden",
        "species": "homo"
    }
}

Для того чтобы записать эти данные в файл с форматом JSON в Python, используется функция dump:

with open("your_file.json", "w") as write_file:
    json.dump(data, write_file)

С другой стороны, если вы продолжаете работать с JSON файлами, то лучше сериализованные данные представить в виде строки (str) с помощью функции dumps.

>>> json_string = json.dumps(data)
>>> json_string
'{"president": {"name": "Joe Biden", "species": "homo"}}'
>>> type(json_string)
str

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

Десериализация JSON

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

У нас уже есть JSON-файл, который мы записали выше. Прочитаем его и выведем на экран с помощью функции load в Python:

>>> with open("your_file.json", "r") as f:
...     data = json.load(f)
>>> data
{'president': {'name': 'Joe Biden', 'species': 'homo'}}
>>> type(data)
dict

Заметим, что функция load выгрузила данные в виде словаря. Результатом функции может стать любой Python объект. В данном случае файл начинался с фигурной скобки {, что соответствует словарю Python.

С другой стороны, если имеется строка с JSON нотацией, то чтобы преобразовать её в словарь, используется функция loads:

>>> data = '{"friends": ["Lilith", "Oleg"]}'
>>> d = json.loads(data)
>>> type(d)
dict

Обратите внимание, что внутри строкового выражения стоят двойные кавычки. Этого требует нотация JSON. Если будут одинарные, то появится исключение.

Ниже таблица, где представлено различие между функциями Python для работы с JSON. Под объектом Python может подразумеваться словарь (dict), список (list), строка (str), число (int, float).

Функция

Определение

dump

Записывает Python-объекты в файл JSON

dumps

Сохраняет объект в виде строки с нотацией JSON

load

Прочитывает файл JSON и возвращает его в виде объекта

loads

Преобразует строку с нотацией JSON в объект

 

О том, как применять формат JSON для сбора, хранения и вывода данных в Python на примерах прикладных задач Data Science, вы узнаете на наших курсах в лицензированном учебном центре обучения и повышения квалификации Data Scientist’ов и IT-специалистов в Москве.

Источники
  1. https://www.json.org/json-en.html
  2. Python docs`
Комментировать