You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.6 KiB

JSON Compatible Encoder

Існують випадки, коли вам може знадобитися перетворити тип даних (наприклад, модель Pydantic) в щось сумісне з JSON (наприклад, dict, list, і т. д.).

Наприклад, якщо вам потрібно зберегти це в базі даних.

Для цього, FastAPI надає jsonable_encoder() функцію.

Використання jsonable_encoder

Давайте уявимо, що у вас є база даних fake_db, яка приймає лише дані, сумісні з JSON.

Наприклад, вона не приймає об'єкти типу datetime, оскільки вони не сумісні з JSON.

Отже, об'єкт типу datetime потрібно перетворити в рядок str, який містить дані в ISO форматі.

Тим самим способом ця база даних не прийматиме об'єкт типу Pydantic model (об'єкт з атрибутами), а лише dict.

Ви можете використовувати jsonable_encoder для цього.

Вона приймає об'єкт, такий як Pydantic model, і повертає його версію, сумісну з JSON:

=== "Python 3.10+"

```Python hl_lines="4  21"
{!> ../../../docs_src/encoder/tutorial001_py310.py!}
```

=== "Python 3.8+"

```Python hl_lines="5  22"
{!> ../../../docs_src/encoder/tutorial001.py!}
```

У цьому прикладі вона конвертує Pydantic model у dict, а datetime у str.

Результат виклику цієї функції - це щось, що можна кодувати з використанням стандарту Python json.dumps().

Вона не повертає велику строку str, яка містить дані у форматі JSON (як строка). Вона повертає стандартну структуру даних Python (наприклад dict) із значеннями та підзначеннями, які є сумісними з JSON.

!!! Примітка jsonable_encoder фактично використовується FastAPI внутрішньо для перетворення даних. Проте вона корисна в багатьох інших сценаріях.