Работа с JSON файлами
Когда мы говорим об обработке данных мы подразумеваем что эти данные откуда-то надо взять. Передача данных от одного места к другому подразумевает что они каким-то образом должны быть поняты обеим сторонам. За длительное время работы компьютеров было создано достаточно много разных форматов данных. В простом представлении это обычно файл, который создан одной программой, а потом его можно открыть в другой, и она его сможет обработать.
Все форматы хранения данных имеют свои особенности. Одни надо сделать так, чтобы их мог прочитать и отредактировать человек, вторые желательно сделать так, чтобы они занимали как можно меньше места, для других критично чтобы их можно было максимально быстро обработать. Есть и таки которые стараются быть универсальными.
Одним из самых популярных форматов передачи данных является JSON (от JavaScript Object Notation, произносится как [джей сон]). Это формат файлов, который не требует дополнительной обработки браузером, то есть можно открыть JSON файл (если он предварительно сохранен на диске) скопировать его содержимое и вставить в консоль разработчика в браузере и исполнить без дополнительных команд. Исполнение такого кода создаст переменную.
Пример JSON файла:
{
"name": "John",
"age": 30,
"isAdmin": false,
"courses": ["python", "git", "development"]
}
Описание формата с иллюстрациям можно прочитать на официальном сайте http://json.org/json-ru.html. Но вы уже могли обратить внимание, что этот фрагмент похож на код похожий на Python код. Фигурные скобки похожи на словарь с ключами, рядом с которыми находятся переменные разных типов.
Если бы мы конвертировали этот формат в эквивалентный Python код, то у нас получилось бы что-то типа:
obj = {
"name": "John",
"age": 30,
"isAdmin": False,
"courses": ["python", "git", "development"]
}
В предложенном примере разница была только в одном символе, вместо false пришлось записать False.
В реальности json файлы выглядят немного менее читаемыми, особенно если содержат буквы не только английского алфавита.
Почему JSON?
Чем примечателен этот формат и почему он получил такую большую популярность? Тут все достаточно просто. Этот файл очень удобен для взаимодействия браузеров и сайтов. А точнее для отображения информации при просмотре страниц в интернете. Сервер отдает данные в сжатом виде в формате ключ-значение, а JavaScript их обрабатывает и создает красивые таблицы или графики. Большинство крупных сайтов получают данные от сервера в формате JSON'а. Как работают сайты мы будем еще разбираться в будущем.
Сейчас этот формат фактически стал главным форматом передачи данных между разными сервисами. Если вы зайдете в раздел документации на многих сайтах, то обнаружите что они предоставляют доступ к своим данным именно в формате JSON.
Чтение и запись JSON файлов
В стандартной библиотеке Python есть специальный модуль для чтения и записи JSON файлов. Его надо импортировать, чтобы получить доступ к его возможностям.
import json
Процесс чтения данных из файла в определенном формате называется десериализация, а запись — сериализация. Соответственно функция, которая будет сохранять данные называется сериализатор, а функция для чтения десериализатор. Иногда этот процесс называют маршалингом (marshaling). Эти слова почти синонимы, но все же имеют некоторые отличия.
Объект, который был доступен в программе иногда, может быть, сериализован, а иногда нет. Например, редактор сохраняет в файл текущее состояние документа, но не сохраняет историю правок и изменений. Хотя в момент пока редактор не закрыт можно отменить последние изменения.
Процесс сериализации Python объекта в JSON документ — это процесс, который преобразует типы доступны в Python в похожие на них JavaScript типы. То есть типы из другого языка программирования. Вот таблица преобразования типов из одного языка в другой и обратно:
| Python | JSON |
|---|---|
| dict | object |
| list, tuple | array |
| str | string |
| int, long, float | number |
| True | true |
| False | false |
| None | null |
Давайте сохраним более-менее сложный объект в формате JSON документа:
import json
data = {
"name": "Джеймс",
"last": "Бонд",
"age": 38,
"code": "007",
"items": ["часы", "пистолет", "костюм", "машина"]
}
write_file = open("bond_file.json", "w")
json.dump(data, write_file)
write_file.close()
Обязательно посмотрите в каком виде сохранился файл.
Результат работы сериализатора необязательно сохранять в файл, а можно получить в виде строки, для этого есть дополнительная функция dumps (с дополнительной s в конце имени)
data_string = json.dumps(data, write_file)
Для того чтобы десериализировать содержимое файла или строки используются функции load() и loads() (для строки).
>>> import json
>>> read_file = open("bond_file.json", "r")
>>> data = json.load(read_file)
>>> read_file.close()
>>> data
{'name': 'Джеймс', 'last': 'Бонд', 'age': 38, 'code': '007', 'items': ['часы', 'пистолет', 'костюм', 'машина']}
