JSON 호환 인코더

JSON 호환 인코더 (JSON Compatible Encoder)

때로는 Pydantic 모델 같은 어떤 데이터 타입을 JSON과 호환되는 형태(dict, list 등)로 바꿔야 할 때가 있어요. 예를 들어 데이터베이스에 저장하려고 할 때가 그렇죠.

그럴 때 FastAPI가 제공하는 jsonable_encoder() 함수를 쓰면 됩니다.

출처: 공식문서

jsonable_encoder 사용하기 (Using the jsonable_encoder)

JSON과 호환되는 데이터만 받는 fake_db 데이터베이스가 있다고 상상해 봅시다.

예를 들어 이 데이터베이스는 datetime 객체를 받지 못해요. datetime은 JSON과 호환되지 않으니까요.

그래서 datetime 객체는 ISO 형식(ISO format)의 데이터를 담은 str로 변환되어야 합니다.

마찬가지로 이 데이터베이스는 Pydantic 모델(속성을 가진 객체)도 받지 못하고, dict만 받아요.

이때 jsonable_encoder를 쓸 수 있습니다.

이 함수는 Pydantic 모델 같은 객체를 받아서 JSON과 호환되는 버전을 돌려줍니다:

from datetime import datetime

from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel

fake_db = {}

class Item(BaseModel):
    title: str
    timestamp: datetime
    description: str | None = None

app = FastAPI()

@app.put("/items/{id}")
def update_item(id: str, item: Item):
    json_compatible_item_data = jsonable_encoder(item)
    fake_db[id] = json_compatible_item_data

이 예제에서 Pydantic 모델은 dict로, datetimestr로 변환됩니다.

호출 결과는 Python 표준 라이브러리의 json.dumps()로 인코딩할 수 있는 형태가 됩니다.

즉, JSON 형식의 긴 str(문자열)을 돌려주는 게 아니라, 값과 하위 값을 모두 JSON과 호환되게 만든 Python 표준 데이터 구조(예: dict)를 돌려줍니다.

!!! note "참고" jsonable_encoder는 사실 FastAPI가 내부적으로 데이터를 변환할 때 사용하는 함수인데, 다른 여러 상황에서도 유용하게 쓸 수 있어요.

더 알아보기 (Learn more)

  • jsonable_encoderdatetime, Pydantic 모델뿐 아니라 다양한 타입을 JSON 호환 형태로 바꿔 줍니다.
  • 실제로 데이터를 저장하기 전에 이 함수로 변환해 두면 나중에 JSON으로 직렬화할 때 편리합니다.
  • FastAPI는 내부적으로 응답을 만들 때도 이 함수를 사용합니다.