Перейти к содержанию

Работа с 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': ['часы', 'пистолет', 'костюм', 'машина']}

image