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로, datetime은 str로 변환됩니다.
호출 결과는 Python 표준 라이브러리의 json.dumps()로 인코딩할 수 있는 형태가 됩니다.
즉, JSON 형식의 긴 str(문자열)을 돌려주는 게 아니라, 값과 하위 값을 모두 JSON과 호환되게 만든 Python 표준 데이터 구조(예: dict)를 돌려줍니다.
!!! note "참고"
jsonable_encoder는 사실 FastAPI가 내부적으로 데이터를 변환할 때 사용하는 함수인데, 다른 여러 상황에서도 유용하게 쓸 수 있어요.
더 알아보기 (Learn more)
jsonable_encoder는datetime, Pydantic 모델뿐 아니라 다양한 타입을 JSON 호환 형태로 바꿔 줍니다.- 실제로 데이터를 저장하기 전에 이 함수로 변환해 두면 나중에 JSON으로 직렬화할 때 편리합니다.
- FastAPI는 내부적으로 응답을 만들 때도 이 함수를 사용합니다.