Перейти к основному содержимому

Язык, на котором говорят API

API обмениваются данными в формате JSON — это текст вида {"id": 1, "name": "Ana"}. Модуль json в Python переводит данные в обе стороны: json.dumps превращает данные Python в текст JSON, а json.loads разбирает текст JSON в данные Python.

Никакой слой сопоставления настраивать не нужно: ключи — это имена полей в том виде, в каком они написаны. dataclass задаёт записи фиксированную структуру, а dataclasses.asdict превращает её в обычный словарь, готовый для json.dumps. Если API требует другое написание ключей, переименуйте их вручную.


Из данных Python в JSON

json.dumps выдаёт JSON в одну строку — для машин; json.dumps(..., indent=2) выдаёт читаемый JSON — для людей и логов. Ничего не отбрасывается автоматически: если пустое поле не должно попасть в JSON, удалите его из словаря перед преобразованием.

В одну строку и красиво

У Ana нет email, и вспомогательная функция удаляет пустое поле из её словаря — её JSON остаётся чистым. Полная запись Ben выводится с отступами.

Prompt
Напишите программу на Python с dataclass User, у которого поле email по умолчанию пустое. Преобразуйте пользователя без email в JSON в одну строку, предварительно удалив пустое поле из словаря, а полного пользователя — с помощью json.dumps и indent=2, и выведите оба результата JSON.
Вывод: полная программа на Python

Из JSON в данные Python

json.loads разбирает JSON в обычные данные Python — словари, списки, строки, числа. Неизвестные ключи не выбрасываются: всё, что есть в JSON, попадает в словарь, а типизированная запись строится только из нужных ей полей. Некорректный JSON вызывает json.JSONDecodeError — перехватывайте эту ошибку: она сигнализирует, что текст вообще не был JSON.

loads и лишний ключ

В JSON есть ключ extra, которого нет в dataclass User, — json.loads сохраняет его в словаре, а dataclass просто берёт два нужных ему поля. Сломанный JSON, напротив, вызывает настоящую ошибку.

Prompt
Напишите программу на Python, которая с помощью json.loads разбирает строку JSON с лишним неизвестным ключом, выводит словарь, сохранивший лишний ключ, и типизированный dataclass User, построенный из нужных ему полей, а затем пытается разобрать сломанный JSON и выводит JSONDecodeError.
Вывод: полная программа на Python

Вложенные данные

Реальные данные API вложены: заказ содержит своего пользователя и список товаров. Dataclass внутри dataclass и списки автоматически превращаются в объекты и массивы JSON — asdict обходит всю структуру.

Заказ с пользователем внутри

Вложенный dataclass User становится вложенным объектом JSON, список товаров — массивом JSON: структура данных Python и есть структура JSON.

Prompt
Напишите программу на Python с dataclass Order, содержащим id, список названий товаров и вложенный dataclass User. Превратите один заказ в словарь с помощью dataclasses.asdict и выведите его с помощью json.dumps и indent=2, чтобы показать вложенные объекты и массивы.
Вывод: полная программа на Python