Модульні уроки (1/4)
JSON: серіалізація та аналіз
JSON — найпоширеніший формат обміну даними. Модуль json в
стандартна бібліотека обробляє це нативно.
Від Python до JSON: dumps
json.dumps(object) серіалізує об’єкт Python у рядок JSON.
import json
dati = {"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}
json.dumps(dati)
# '{"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}'
json.dumps(dati, indent=2, sort_keys=True)
# multi-line formatted string, keys sortedВід JSON до Python: loads
json.loads(string) аналізує рядок JSON і повертає об’єкти Python.
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"] # 'Ada'
type(d) # <class 'dict'>Відображення типів
| JSON | Python |
|---|---|
object | dict |
array | list |
string | str |
number | int / float |
true | True |
false | False |
null | None |
З файлу: dump / load
with open("config.json", "w") as f:
json.dump(dati, f, indent=2)
with open("config.json") as f:
dati = json.load(f)Без кінцевої "s" вони працюють з файлами (подібно до файлів), з "s" на рядках.
Несеріалізовані типи: default
datetime, set, ваші спеціальні класи не можна серіалізувати за замовчуванням:
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializableВи можете передати функцію default, яка повідомляє, як їх трансформувати:
def converti(obj):
if isinstance(obj, datetime.datetime):
return obj.isoformat()
if isinstance(obj, set):
return list(obj)
raise TypeError(f"non serializzabile: {type(obj)}")
json.dumps({"ora": datetime.datetime.now()}, default=converti)JSON і файлові операції
Стандартна бібліотека також надає json.dump() та json.load() (без 's') для запису та читання даних JSON безпосередньо у файли та з файлів, природно поєднуючись із менеджерами контексту:
with open("data.json", "w") as f:
json.dump(data, f)Спробуйте
Дано `data = {'nome': 'Ada', 'anni': 36}`, серіалізуйте його в JSON з indent=2 і призначте змінній `json_str`. Оцініть `json_str`.
Показати підказку
json.dumps(дані, відступ=2)
Рішення доступне після 3 спроб
Повторна вправа
Дано рядок JSON s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]', проаналізуйте його за допомогою json.loads у дані та обчисліть загальну суму значень 'v'. Оцініть загальну суму.
Показати підказку
json.loads повертає список dicts.
Рішення доступне після 3 спроб
Додатковий виклик
Враховуючи рядок JSON \`json_data = '{"name": "Alice", "age": 30}'\`, декодуйте його в словник Python за допомогою \`json.loads\`. Витягніть значення, пов’язане з ключем \`'name'\`, і збережіть його в \`user_name\`. Нарешті, оцініть \`user_name\`.
Показати підказку
Використовуйте json.loads(json_data) для декодування, а потім отримайте доступ через data['name'].
Рішення доступне після 3 спроб