{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Формат json\n", "\n", "Чтение строк из файлов не составляет труда в python, а вот чтение чисел требует дополнительных усилий, т.к. встроенные функции чтения из данных возвращают строки, которые потом отдельно необходимо приводить к числовому типу данных. Чтение структурированных данных обычными средствами ещё труднее. \n", "\n", "Гораздо удобнее использовать для таких целей [JSON](https://www.json.org/json-en.html). \n", "> JSON (англ. JavaScript Object Notation, обычно произносится как /ˈdʒeɪsən/ JAY-sən) — текстовый формат обмена данными, основанный на JavaScript. Как и многие другие текстовые форматы, JSON легко читается людьми. [Источник: Wikipedia](https://ru.wikipedia.org/wiki/JSON).\n", "\n", "JSON изначально был придуман для [сериализации](https://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F) объектов языка `javascript`, но со временем стал применяться и в других языках программирования. \n", "\n", "\n", "За работу с `JSON` в python отвечает модуль стандартной библиотеки [json](https://docs.python.org/3/library/json.html#module-json). Основные функции этого модуля:\n", "- [json.dumps](https://docs.python.org/3/library/json.html#json.dumps) сериализует объект в строку;\n", "- [json.dump](https://docs.python.org/3/library/json.html#json.dump) тоже самое, но сразу записывает в файл;\n", "- [json.loads](https://docs.python.org/3/library/json.html#json.loads) десериализует строку `json` и создаёт объект;\n", "- [json.load](https://docs.python.org/3/library/json.html#json.load) десериализует содержимое файла `json`.\n", "\n", "Встроенные контейнеры `list` и `dict` очень хорошо подходят для хранения в формате `JSON`. Рассмотрим самый простой пример с ними: создадим список и словарь и сериализуем их в строки." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "json представление для спика: [1, 1.0, \"a\"]\n", "json представление для словаря: {\"key1\": \"value1\", \"key2\": \"value2\"}\n" ] } ], "source": [ "import json\n", "\n", "a_list = [1, 1., \"a\"]\n", "json_list = json.dumps(a_list)\n", "\n", "a_dict = {\n", " \"key1\": \"value1\",\n", " \"key2\": \"value2\"\n", " }\n", "json_dict = json.dumps(a_dict)\n", "\n", "print(f\"json представление для списка: {json_list}\")\n", "print(f\"json представление для словаря: {json_dict}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь исходные объекты можно получить обратно." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 1.0, 'a'] \n", "{'key1': 'value1', 'key2': 'value2'} \n" ] } ], "source": [ "a_list_recovery = json.loads(json_list)\n", "print(a_list_recovery, type(a_list_recovery))\n", "\n", "a_dict_recovery = json.loads(json_dict)\n", "print(a_dict_recovery, type(a_dict_recovery))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Из примера видно, что удалось десериализовать объекты из строки `json` в исходном виде. Заметим, что между сериализацией и десериализацией строковое представление объекта могло быть сохранено в файл и прочитано обратно, передано по сети интернет и прочитано другим компьютером и многое другое.\n", "\n", "Коллекции в python могут быть вложенными друг в друга и `json` без проблем справляется с представлением таких вложенных структур." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "import json\n", "import os\n", "\n", "course_description = {\n", " \"lecturer\": \"Fadeev Egor\",\n", " \"course\": \"Computer technologies workshop\",\n", " \"topics\": [\"python3\", \"scientific libraries\", \"mathematical modeling\"],\n", " \"where\": {\n", " \"Faculty\": \"Faculty of physics\",\n", " \"room\": \"5-42\"\n", " },\n", " \"when\": {\n", " \"day of week\": \"Thursday\",\n", " \"time\": \"5:05 pm\"\n", " },\n", " \"number of students\": 25\n", "}\n", "\n", "os.makedirs(\"tmp\", exist_ok=True)\n", "with open(os.path.join(\"tmp\", \"course_description.json\"), \"w\") as f:\n", " json.dump(course_description, f, indent=4)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если выполнить предыдущую ячейку, то в папке `tmp` должен создаться файл `course_description.json` с следующим содержимым (с точностью до порядка ключей).\n", "\n", "```json\n", "{\n", " \"lecturer\": \"Fadeev Egor\",\n", " \"course\": \"Computer technologies workshop\",\n", " \"topics\": [\n", " \"python3\",\n", " \"scientific libraries\",\n", " \"mathematical modeling\"\n", " ],\n", " \"where\": {\n", " \"Faculty\": \"Faculty of physics\",\n", " \"room\": \"5-42\"\n", " },\n", " \"when\": {\n", " \"day of week\": \"Thursday\",\n", " \"time\": \"5:05 pm\"\n", " },\n", " \"number of students\": 25\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Далее этот файл может быть открыт другой программой на python или другом языке или передан по сети и открыт заново." ] } ], "metadata": { "interpreter": { "hash": "8617202e12f254480e1fae3258716b685f1a56bcbf234a446366b4fd3345ed22" }, "kernelspec": { "display_name": "Python 3.8.10 64-bit", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }