Формат json

Формат json

Чтение строк из файлов не составляет труда в python, а вот чтение чисел требует дополнительных усилий, т.к. встроенные функции чтения из данных возвращают строки, которые потом отдельно необходимо приводить к числовому типу данных. Чтение структурированных данных обычными средствами ещё труднее.

Гораздо удобнее использовать для таких целей JSON.

JSON (англ. JavaScript Object Notation, обычно произносится как /ˈdʒeɪsən/ JAY-sən) — текстовый формат обмена данными, основанный на JavaScript. Как и многие другие текстовые форматы, JSON легко читается людьми. Источник: Wikipedia.

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

За работу с JSON в python отвечает модуль стандартной библиотеки json. Основные функции этого модуля:

  • json.dumps сериализует объект в строку;

  • json.dump тоже самое, но сразу записывает в файл;

  • json.loads десериализует строку json и создаёт объект;

  • json.load десериализует содержимое файла json.

Встроенные контейнеры list и dict очень хорошо подходят для хранения в формате JSON. Рассмотрим самый простой пример с ними: создадим список и словарь и сериализуем их в строки.

import json

a_list = [1, 1., "a"]
json_list = json.dumps(a_list)

a_dict = {
    "key1": "value1",
    "key2": "value2"
    }
json_dict = json.dumps(a_dict)

print(f"json представление для списка: {json_list}")
print(f"json представление для словаря: {json_dict}")
json представление для списка: [1, 1.0, "a"]
json представление для словаря: {"key1": "value1", "key2": "value2"}

Теперь исходные объекты можно получить обратно.

a_list_recovery = json.loads(json_list)
print(a_list_recovery, type(a_list_recovery))

a_dict_recovery = json.loads(json_dict)
print(a_dict_recovery, type(a_dict_recovery))
[1, 1.0, 'a'] <class 'list'>
{'key1': 'value1', 'key2': 'value2'} <class 'dict'>

Из примера видно, что удалось десериализовать объекты из строки json в исходном виде. Заметим, что между сериализацией и десериализацией строковое представление объекта могло быть сохранено в файл и прочитано обратно, передано по сети интернет и прочитано другим компьютером и многое другое.

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

import json
import os

course_description = {
    "lecturer": "Fadeev Egor",
    "course": "Computer technologies workshop",
    "topics": ["python3", "scientific libraries", "mathematical modeling"],
    "where": {
        "Faculty": "Faculty of physics",
        "room": "5-42"
    },
    "when": {
        "day of week": "Thursday",
        "time": "5:05 pm"
    },
    "number of students": 25
}

os.makedirs("tmp", exist_ok=True)
with open(os.path.join("tmp", "course_description.json"), "w") as f:
    json.dump(course_description, f, indent=4)

Если выполнить предыдущую ячейку, то в папке tmp должен создаться файл course_description.json с следующим содержимым (с точностью до порядка ключей).

{
    "lecturer": "Fadeev Egor",
    "course": "Computer technologies workshop",
    "topics": [
        "python3",
        "scientific libraries",
        "mathematical modeling"
    ],
    "where": {
        "Faculty": "Faculty of physics",
        "room": "5-42"
    },
    "when": {
        "day of week": "Thursday",
        "time": "5:05 pm"
    },
    "number of students": 25
}

Далее этот файл может быть открыт другой программой на python или другом языке или передан по сети и открыт заново.