Skip to content

Commit 02346b6

Browse files
committed
updated
1 parent ca6ac41 commit 02346b6

File tree

1 file changed

+203
-5
lines changed

1 file changed

+203
-5
lines changed

python_pd/05_files/04_json.ipynb

+203-5
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,200 @@
1010
"name": "python",
1111
"nbconvert_exporter": "python",
1212
"pygments_lexer": "ipython3",
13-
"version": 3
13+
"version": "3.9.0-final"
1414
},
15-
"orig_nbformat": 2
15+
"orig_nbformat": 2,
16+
"kernelspec": {
17+
"name": "python3",
18+
"display_name": "Python 3",
19+
"language": "python"
20+
}
1621
},
1722
"nbformat": 4,
1823
"nbformat_minor": 2,
1924
"cells": [
2025
{
2126
"source": [
22-
"# Модуль ```json```"
27+
"# Модуль ```json```\n",
28+
"\n",
29+
"Формат данных ```json``` был основан на нотации языка JavaScript для обмена данными."
30+
],
31+
"cell_type": "markdown",
32+
"metadata": {}
33+
},
34+
{
35+
"cell_type": "code",
36+
"execution_count": 1,
37+
"metadata": {},
38+
"outputs": [],
39+
"source": [
40+
"import json"
41+
]
42+
},
43+
{
44+
"source": [
45+
"Модуль ```json``` поддерживает несколько функций для сериализации (кодирование) и десериализации (декодирование) данных. Сериализация или кодирование это преобразование Python объектов в строку. Для такой сериализации предусмотрена функция ```json.dumps```, которая принимает Python объект и возвращает строку. Аналогом этой функции выступает функция ```json.dump```. Она принимает объект и файл для записи этого объекта. Десериализация или декодирование это обратная сериализации операция. Она преобразует строку в Python объекты. Для десериализации модуль ```json``` предоставляет две функции ```json.loads``` и ```json.load``` аналогичных ```json.dumps``` и ```json.dump``` соответственно.\n",
46+
"\n",
47+
"Не все объекты Python могут быть сериализованы в ```json``` формат. Например, списки и кортежи сериализуются в виде массивов, а множества и комплексные числа не поддерживают сериализацию \"из коробки\". Некоторые объекты, такие как ```None```, сериализуются в аналогичные, приближенные к используемым в JavaScript. В таблице соотнесены Python типы и формат их сериализации.\n",
48+
"\n",
49+
"| Тип данных | Объект после сериализации |\n",
50+
"|---------------|---------------------------|\n",
51+
"| ```int``` | ```int``` |\n",
52+
"| ```float``` | ```float``` |\n",
53+
"| ```complex``` | Не поддерживается |\n",
54+
"| ```list``` | Массив |\n",
55+
"| ```tuple``` | Массив |\n",
56+
"| ```dict``` | Объект |\n",
57+
"| ```set``` | Не поддерживается |\n",
58+
"| ```True``` | ```true``` |\n",
59+
"| ```False``` | ```false``` |\n",
60+
"| ```None``` | ```null``` |"
61+
],
62+
"cell_type": "markdown",
63+
"metadata": {}
64+
},
65+
{
66+
"cell_type": "code",
67+
"execution_count": 2,
68+
"metadata": {},
69+
"outputs": [
70+
{
71+
"output_type": "stream",
72+
"name": "stdout",
73+
"text": [
74+
"Целое число в json: 42\nЧисло с плавающей точкой в json: 42.0\nСписок в json: [1, 2, 3]\nКортеж в json: [1, 2, 3]\nСловарь в json: {\"1\": \"a\", \"2\": \"b\"}\nTrue в json: true\nFalse в json: false\nNone в json: null\n"
75+
]
76+
}
77+
],
78+
"source": [
79+
"l = [1, 2, 3]\n",
80+
"t = tuple(l)\n",
81+
"d = {1: 'a', 2: 'b'}\n",
82+
"\n",
83+
"print(f'Целое число в json: {json.dumps(42)}')\n",
84+
"print(f'Число с плавающей точкой в json: {json.dumps(42.)}')\n",
85+
"print(f'Список в json: {json.dumps(l)}')\n",
86+
"print(f'Кортеж в json: {json.dumps(t)}')\n",
87+
"print(f'Словарь в json: {json.dumps(d)}')\n",
88+
"print(f'True в json: {json.dumps(True)}')\n",
89+
"print(f'False в json: {json.dumps(False)}')\n",
90+
"print(f'None в json: {json.dumps(None)}')"
91+
]
92+
},
93+
{
94+
"source": [
95+
"При преобразовании некоторых объектов в ```json``` формат стоит помнить некоторые особенности. Например, ключи словарей в формате ```json``` всегда имеют строковый тип. Это приводит к тому, что любые Python объекты будут преобразованы в строку для записи в ```json```. Это повлияет и на обратный процесс - десериализацию."
96+
],
97+
"cell_type": "markdown",
98+
"metadata": {}
99+
},
100+
{
101+
"cell_type": "code",
102+
"execution_count": 3,
103+
"metadata": {},
104+
"outputs": [
105+
{
106+
"output_type": "stream",
107+
"name": "stdout",
108+
"text": [
109+
"Результат сериализации: {\"1\": \"a\", \"2.2\": \"b\", \"false\": [1, 2, 3], \"null\": true}\nРезультат десериализации: {'1': 'a', '2.2': 'b', 'false': [1, 2, 3], 'null': True}\n"
110+
]
111+
}
112+
],
113+
"source": [
114+
"d = {1: 'a', 2.2: 'b', False: [1, 2, 3], None: True}\n",
115+
"res = json.dumps(d)\n",
116+
"print(f'Результат сериализации: {res}')\n",
117+
"print(f'Результат десериализации: {json.loads(res)}')"
118+
]
119+
},
120+
{
121+
"source": [
122+
"В связи с тем, что ```list``` и ```tuple``` неразличимы в формате ```json```, то при обратном преобразовании будет всегда получаться ```list```."
123+
],
124+
"cell_type": "markdown",
125+
"metadata": {}
126+
},
127+
{
128+
"cell_type": "code",
129+
"execution_count": 4,
130+
"metadata": {},
131+
"outputs": [
132+
{
133+
"output_type": "stream",
134+
"name": "stdout",
135+
"text": [
136+
"Целое число из json: 1\nЧисло с плавающей точкой из json: 1.5\nСписок из json: [1, 2, 3]\nСловарь из json: {'1': 'a', '2': 'b'}\nTrue из json: True\nFalse из json: False\nNone из json: None\n"
137+
]
138+
}
139+
],
140+
"source": [
141+
"print(f'Целое число из json: {json.loads(\"1\")}')\n",
142+
"print(f'Число с плавающей точкой из json: {json.loads(\"1.5\")}')\n",
143+
"print(f'Список из json: {json.loads(\"[1, 2, 3]\")}')\n",
144+
"\n",
145+
"s = '{\"1\": \"a\", \"2\": \"b\"}'\n",
146+
"print(f'Словарь из json: {json.loads(s)}')\n",
147+
"print(f'True из json: {json.loads(\"true\")}')\n",
148+
"print(f'False из json: {json.loads(\"false\")}')\n",
149+
"print(f'None из json: {json.loads(\"null\")}')"
150+
]
151+
},
152+
{
153+
"source": [
154+
"Для настройки сериализации функции ```json.dumps``` и ```json.dump``` принимают ряд необязательных аргументов, например:\n",
155+
"- ```ensure_ascii``` - экранирование не ascii символов, по умолчанию True (все не ascii символы будут преобразованы в байты);\n",
156+
"- ```indent``` - отсутп, по умолчанию сериализация происходит в строку;\n",
157+
"- ```check_circular``` - проверка циклических ссылок в контейнерах;\n",
158+
"- ```separators``` - разделители в массивах и словарях.\n",
159+
"- и другие."
160+
],
161+
"cell_type": "markdown",
162+
"metadata": {}
163+
},
164+
{
165+
"cell_type": "code",
166+
"execution_count": 5,
167+
"metadata": {},
168+
"outputs": [
169+
{
170+
"output_type": "stream",
171+
"name": "stdout",
172+
"text": [
173+
"{\n \"place_id\": 204078161,\n \"osm_id\": 520248509,\n \"boundingbox\": [\n \"56.0035966\",\n \"56.0049951\",\n \"92.770395\",\n \"92.7736184\"\n ],\n \"lat\": \"56.00429815\",\n \"lon\": \"92.77089628097374\",\n \"type\": \"university\",\n \"importance\": 0.42099999999999993,\n \"address\": {\n \"house_number\": \"79\",\n \"road\": \"Свободный проспект\",\n \"suburb\": \"Октябрьский район\",\n \"city_district\": \"Октябрьский район\",\n \"city\": \"Красноярск\",\n \"county\": \"городской округ Красноярск\",\n \"state\": \"Красноярский край\",\n \"region\": \"Сибирский федеральный округ\",\n \"postcode\": \"660000\",\n \"country\": \"Россия\",\n \"country_code\": \"ru\"\n }\n}\n"
174+
]
175+
}
176+
],
177+
"source": [
178+
"address = {\n",
179+
" 'place_id': 204078161, \n",
180+
" 'osm_id': 520248509, \n",
181+
" 'boundingbox': ['56.0035966', '56.0049951', '92.770395', '92.7736184'], \n",
182+
" 'lat': '56.00429815', \n",
183+
" 'lon': '92.77089628097374', \n",
184+
" 'type': 'university', \n",
185+
" 'importance': 0.42099999999999993, \n",
186+
" 'address': {\n",
187+
" 'house_number': '79', \n",
188+
" 'road': 'Свободный проспект', \n",
189+
" 'suburb': 'Октябрьский район', \n",
190+
" 'city_district': 'Октябрьский район', \n",
191+
" 'city': 'Красноярск', \n",
192+
" 'county': 'городской округ Красноярск', \n",
193+
" 'state': 'Красноярский край', \n",
194+
" 'region': 'Сибирский федеральный округ', \n",
195+
" 'postcode': '660000', \n",
196+
" 'country': 'Россия', \n",
197+
" 'country_code': 'ru'\n",
198+
" }\n",
199+
"}\n",
200+
"res = json.dumps(address, ensure_ascii=False, indent=4)\n",
201+
"print(f'{res}')"
202+
]
203+
},
204+
{
205+
"source": [
206+
"Для записи и чтения из файла используйте функции ```json.dump``` и ```json.load``` соответственно."
23207
],
24208
"cell_type": "markdown",
25209
"metadata": {}
@@ -29,11 +213,25 @@
29213
"execution_count": null,
30214
"metadata": {},
31215
"outputs": [],
32-
"source": []
216+
"source": [
217+
"with open('data.json', 'w') as f:\n",
218+
" json.dump(address, f)"
219+
]
220+
},
221+
{
222+
"source": [
223+
"Помимо всех вышеперечисленных базовых функций можно реализовать собственный сериализатор и десериализатор формата ```json```. Для этого модуль ```json``` предоставляет базовые класса ```json.JSONEncoder``` и ```json.JSONDecoder```."
224+
],
225+
"cell_type": "markdown",
226+
"metadata": {}
33227
},
34228
{
35229
"source": [
36-
"# Полезные ссылки"
230+
"# Полезные ссылки\n",
231+
"\n",
232+
"- [Официальный сайт json](https://www.json.org/json-ru.html)\n",
233+
"- [Документация к модулю ```json```](https://docs.python.org/3/library/json.html)\n",
234+
"- [Working With JSON Data in Python](https://realpython.com/python-json/)"
37235
],
38236
"cell_type": "markdown",
39237
"metadata": {}

0 commit comments

Comments
 (0)