Перейти до основного вмісту
Модуль 8 · Урок 1 із 429/36 у курсі~10 min
Модульні уроки (1/4)

JSON: серіалізація та аналіз

JSON — найпоширеніший формат обміну даними. Модуль json в стандартна бібліотека обробляє це нативно.

Від Python до JSON: dumps

json.dumps(object) серіалізує об’єкт Python у рядок JSON.

Python
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.

Python
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"]    # 'Ada'
type(d)      # <class 'dict'>

Відображення типів

JSONPython
objectdict
arraylist
stringstr
numberint / float
trueTrue
falseFalse
nullNone

З файлу: dump / load

Python
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, ваші спеціальні класи не можна серіалізувати за замовчуванням:

Python
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializable

Ви можете передати функцію default, яка повідомляє, як їх трансформувати:

Python
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 безпосередньо у файли та з файлів, природно поєднуючись із менеджерами контексту:

Python
with open("data.json", "w") as f:
    json.dump(data, f)

Спробуйте

вправи#python.m8.l1.e1
Спроби: 0Завантаження…

Дано `data = {'nome': 'Ada', 'anni': 36}`, серіалізуйте його в JSON з indent=2 і призначте змінній `json_str`. Оцініть `json_str`.

Завантаження редактора…
Показати підказку

json.dumps(дані, відступ=2)

Рішення доступне після 3 спроб

Повторна вправа

вправи#python.m8.l1.e2
Спроби: 0Завантаження…

Дано рядок JSON s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]', проаналізуйте його за допомогою json.loads у дані та обчисліть загальну суму значень 'v'. Оцініть загальну суму.

Завантаження редактора…
Показати підказку

json.loads повертає список dicts.

Рішення доступне після 3 спроб

Додатковий виклик

вправи#python.m8.l1.e3
Спроби: 0Завантаження…

Враховуючи рядок JSON \`json_data = '{"name": "Alice", "age": 30}'\`, декодуйте його в словник Python за допомогою \`json.loads\`. Витягніть значення, пов’язане з ключем \`'name'\`, і збережіть його в \`user_name\`. Нарешті, оцініть \`user_name\`.

Завантаження редактора…
Показати підказку

Використовуйте json.loads(json_data) для декодування, а потім отримайте доступ через data['name'].

Рішення доступне після 3 спроб