Programming Language/Python

[FastAPI] 11. JSON 호환 인코더: jsonable_encoder

LeeJaeJun 2024. 6. 20. 22:49
728x90
반응형

jsonable_encoder

  • FastAPI에서는 데이터 타입(Pydantic 모델 등)을 JSON 호환 형태(예: dict, list 등)로 변환해야 하는 경우 사용
    • ex) 데이터베이스에 저장할 때, JSON으로 응답할 때
  • 작동원리 예시
    • Pydantic 모델 변환: Pydantic 모델을 딕셔너리로 변환
    • datetime 변환: datetime 객체를 ISO 형식의 문자열로 변환
    • UUID 변환: UUID 객체를 문자열로 변환
    • Enum 변환: Enum 객체를 해당 값으로 변환
    • set 변환: set 객체를 리스트로 변환
    • JSON 호환 형태 반환: 최종적으로 JSON으로 직렬화할 수 있는 Python 표준 데이터 구조(딕셔너리, 리스트 등)를 반환
from datetime import datetime
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel

# 가짜 데이터베이스
fake_db = {}

# Pydantic 모델 정의
class Item(BaseModel):
    title: str
    timestamp: datetime
    description: str | None = None

app = FastAPI()

# 아이템 업데이트 엔드포인트
@app.put("/items/{id}")
def update_item(id: str, item: Item):
    # Pydantic 모델을 JSON 호환 형태로 변환
    json_compatible_item_data = jsonable_encoder(item)
    # 변환된 데이터를 가짜 데이터베이스에 저장
    fake_db[id] = json_compatible_item_data

 

  • Item 모델: Pydantic 모델로, title, timestamp, description 속성을 가짐
  • update_item 엔드포인트: 이 엔드포인트는 아이템을 업데이트하고 데이터베이스에 저장
  • jsonable_encoder: item 객체를 JSON 호환 형태로 변환합니다. datetime 객체는 ISO 형식의 문자열로 변환
  • 데이터베이스에 저장: 변환된 데이터를 가짜 데이터베이스 fake_db에 저장
from pydantic import BaseModel
from fastapi.encoders import jsonable_encoder

class SubItem(BaseModel):
    name: str

class Item(BaseModel):
    id: int
    subitem: SubItem

item = Item(id=1, subitem=SubItem(name="SubItemName"))
encoded_item = jsonable_encoder(item)
print(encoded_item)  # {'id': 1, 'subitem': {'name': 'SubItemName'}}
  • 중첩된 구조에서도 사용 가능

 

728x90
반응형

'Programming Language > Python' 카테고리의 다른 글

[SQLAlchemy] 1. Engine  (0) 2024.06.22
[FastAPI] 12. Update: PUT, PATCH  (0) 2024.06.20
[FastAPI] 10. Form Data & Request File  (0) 2024.06.20
[FastAPI] 9. Extra Data Types  (0) 2024.06.19
[FastAPI] 8. Fields  (0) 2024.06.19