Перейти к основному содержимому
Модуль 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'>

Сопоставление типов

JSONПитон
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 с отступом = 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 возвращает список диктовок.

Решение доступно после 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 попыток