Найти в Дзене
programmer's notes (python and more)

Программирование на языке Python. Стандартная библиотека поддержки формата данных json. Приложение 1

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Статья является приложением к уроку

Формат json и стандартная библиотека поддержки Python

json (JavaScript Object Notation) — широко используемый язык описания структуры данных. Популярность его обусловлена простотой и наличием поддержки в разных языках программирования. Поскольку описание представляет собой обычный текстовый файл или просто строка, то им удобно пользоваться для передачи данных, для хранения в обычных текстовых файлах или же в базе данных.

Основу языка json составляют два типа данных: object (объект) и array (массив). Кроме того есть не большой набор типов данных.

Удобно рассмотреть таблицу преобразования структур Python в json и обратно (см. ниже).

Таблица соответствия
Таблица соответствия

Глядя на таблицу, выделим несколько важных моментов:

  • Словари Python преобразуются в object и обратно. Эта структура Python наиболее адекватно подходит для преобразования в формат json.
  • Кортеж как и список преобразуется в array. При обратном преобразовании array преобразуется в список. Т.е. при обратном преобразовании кортеж, если он был теряется. С точки зрения программирования это не так уж и важно, но иметь это в виду следует.
  • В списке отсутствует такая структура как множество. Этот вид коллекций не имеет аналогов в json. И это нужно иметь и не использовать данные в множествах, если предполагается использование json.

В остальном на первый взгляд соответствие полное. Однако ниже мы увидим, что и здесь есть нюансы. Библиотека поддержки json подключается обычной командой import.

текст программы см. ниже
текст программы см. ниже
primer154.py

Результат выполнения программы

[{"nmb": 8.111111111111, "name": "Petrov"}, {"Q": "qwerty"}]
[{'nmb': 8.111111111111, 'name': 'Petrov'}, {'Q': 'qwerty'}]
8.111111111111 qwerty

Первая строка это как раз в чистом json. Затем производится обратное преобразование и мы видим, что получаем почти точный исходный результат. Именно "почти" так как кавычки теперь все одинарные. Конечно, то не слишком важно, но иметь это в виду следует.

Проведём два эксперимента

1. Напишем фамилию кириллицей: "name": "Петров". Получим.

[{"nmb": 8.111111111111, "name": "\u041f\u0435\u0442\u0440\u043e\u0432"}, {"Q": "qwerty"}]
[{'nmb': 8.111111111111, 'name': 'Петров'}, {'Q': 'qwerty'}]
8.111111111111 qwerty

Мы видим, что кириллические буквы были заменены были заменены кодами в Unicode. Но заметим, что это никак не повлияло на обратное преобразование.

2. Вернемся снова к латинице, но заменим один из ключей словаря на число.

Текст программы см. ниже
Текст программы см. ниже
primer155.py

Результат выполнения

[{"1": 8.111111111111, "name": "Petrov"}, {"Q": "qwerty"}]
[{'1': 8.111111111111, 'name': 'Petrov'}, {'Q': 'qwerty'}]
8.111111111111 qwerty

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

В программах выше структура Python преобразовывалась в строку json. Но можно оперировать и файлами.

Текст программы см. ниже
Текст программы см. ниже
primer156.py

Программа берёт структуру json из файла преобразуя в структуру Python, а потом снова преобразует эту структуру в json и сохраняет в другом файле. На консоль программа выводит

Букашкин

Это просто проверка, что преобразование в структуру Python произведено верно.

Содержимое файла data.json

{"Глава компании":
{"name": "Букашкин",
"национальность": "бабуин"}
}

Кстати перевод строки (или отступы) в тексте не играет никакой роли в преобразовании.

Содержимое файла data2.json

{"Глава компании": {"name": "Букашкин", "национальность": "бабуин"}}

Мы видим, что получили в сущности тот же json текст (о переводе строки я уже сказал).

Обращу внимание на следующие моменты.

  1. Открытие файлов для чтения и записи производится обычным известным нам способом. Но чтение и запись осуществляется методами библиотеки json.
  2. ensure_ascii=False указывает, что в json следует использовать символы. а не Unicode. Попробуйте использовать ensure_ascii=True и посмотрите, что получится.

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

Мы не закончили своё изложение по поддержке формата json в языке Python. В следующем приложении (Приложение 2) к уроку мы подробнее рассмотрим саму библиотеку json и некоторые сложности преобразования.

Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Выбор правильной структуры половина решения задачи, ну может не половина, но 1/3 точно :)
Выбор правильной структуры половина решения задачи, ну может не половина, но 1/3 точно :)