23. JSON Compatible Encoder
1. JSON Compatible Encoder
- Pydantic 모델과 같은 어떠한 데이터 타입을
dict
및 list
와 같이 JSON과 호환되는 데이터 타입으로 변환해야 하는 경우가 있다.
- 데이터베이스에 해당 데이터를 저장해야 하는 경우를 예로 들 수 있는데, 이를 위해 FastAPI는
jsonable_encoder()
를 제공한다.
2. Using the jsonable_encoder
- JSON 호환 데이터만 수신하는
fake_db
데이터베이스가 있다고 가정해 보자.
- 이런 상황에서 JSON과 호환되지 않는
datetime
객체는 수신되지 않는다.
- 따라서
datetime
객체는 ISO 형식의 데이터를 포함하는 str
타입으로 변환되어야 한다.
- 같은 방식으로, 이 데이터베이스는 속성이 있는 객체인 Pydantic 모델을 수신하지 않고
dict
타입만 수신하게 된다.
- 이런 상황을
jsonable_encoder
를 사용하여 해결할 수 있다.
- 다음의 예제는 Pydantic 모델과 같은 객체를 수신하고, JSON 호환 버전을 반환하는 예제이다.
from datetime import datetime
from typing import Optional
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
app = FastAPI()
fake_db = {}
class Item(BaseModel):
title: str
timestamp: datetime
description: Optional[str] = None
@app.put("/items/{id}")
async def update_item(id: str, item: Item):
json_compatible_item_data = jsonable_encoder(item)
fake_db[id] = json_compatible_item_data
- 위의 예제를 실행하면, JSON 전체에 대한
str
타입을 반환하는 것이 아니라 dict
타입과 같은 Python 표준 데이터 구조를 반환한다.
- 그러므로 Python 표준
json.dumps()
로 인코딩할 수 있는 것이다.
References