当サイトは、アフィリエイト広告を利用しています

【Python × FastApi】シリアライズとデシリアライズの使い方

作成日:2024月10月23日
更新日:2024年10月23日

PythonのFastApiでREST APIをを実装する際等は
データを

  • オブジェクト(インスタンス)
  • 辞書(ディクショナリ)
  • JSON

の3つの形を意識して扱う必要がある。

この3つのデータの変換方法をまとめて忘備録として残す。
FastApiはPydanticをネイティブに統合しているため
特にimportなしで、シリアライズ・デシリアライズを行うことができる。
※FlaskでもPydanticをインストールすれば可能

pydanticに関しては下記記事で紹介しています

シリアライズ

シリアライズはモデルのインスタンスを「辞書」や「JSON」などの形式に変換すること

データモデルインスタンスから辞書型に変換

データモデルインスタンスから辞書型に変換する場合は

  • model_dump()

を使う。

model_dump()
from pydantic import BaseModel
# データモデルクラスを定義
class User(BaseModel):
user_id: int
name: str
age: int
# データモデルのインスタンス生成
user = User(user_id=1, name="Charlie", age=40)
# データモデル自体の型を確認
print(f"ユーザモデルの型: {type(user)}")
# 出力: ユーザモデルの型: <class '__main__.User'>
# シリアライズ: データモデルインスタンスを辞書に変換
user_dict = user.model_dump()
print(user_dict)
print(f"型: {type(user_dict)}") # 型を出力
# 出力: {'user_id': 1, 'name': 'Charlie', 'age': 40}
# 型: <class 'dict'>

データモデルインスタンスを辞書に変換できる。

下記のようにdictを使ってもできるが非推奨なので、model_dump()を使うようにする

dict
# シリアライズ: データモデルインスタンスを辞書に変換
user_dict = user.dict

VSCodeでは警告になる。

データモデルインスタンスからJSONに変換

データモデルインスタンスからJSON文字列にする場合は

  • model_dump_json()

を使う。

model_dump_json()
from pydantic import BaseModel
# データモデルクラスを定義
class User(BaseModel):
user_id: int
name: str
age: int
# データモデルのインスタンス生成
user = User(user_id=1, name="Charlie", age=40)
# シリアライズ: PydanticモデルをJSON形式に変換
user_json = user.model_dump_json()
print(user_json)
print(f"型: {type(user_json)}") # 型を出力
# 出力: {"user_id": 1, "name": "Charlie", "age": 40}
# 型: <class 'str'>

データモデルインスタンスをJSONに変換できる

辞書からJSONに変換

辞書からJSONに変換する場合はPython標準のjsonをimportして

  • json.dumps()

を使う

json.dumps()
import json
from pydantic import BaseModel
# データモデルクラスを定義
class User(BaseModel):
user_id: int
name: str
age: int
# データモデルのインスタンス生成
user = User(user_id=1, name="Charlie", age=40)
# データモデル自体の型を確認
print(f"ユーザモデルの型: {type(user)}")
# 出力: ユーザモデルの型: <class '__main__.User'>
# シリアライズ: データモデルインスタンスを辞書に変換
user_dict = user.model_dump()
print(user_dict)
print(f"型: {type(user_dict)}") # 型を出力
# 出力: {'user_id': 1, 'name': 'Charlie', 'age': 40}
# 型: <class 'dict'>
# シリアライズ: 辞書をJSONに変換
json_dict = json.dumps(user_dict)
print(json_dict)
print(f"型: {type(json_dict)}") # 型を出力
# 出力: {"user_id": 1, "name": "Charlie", "age": 40}
# 型: <class 'str'>

あまり使うことは少ないかもしれない

デシリアライズ

シリアライズとは逆で「辞書」や「JSON」などのデータ形式からPydanticのモデルにデータを読み込む

辞書型からデータモデルインスタンスに変換

デシリアライズ1
from pydantic import BaseModel
# Pydanticデータモデル
class User(BaseModel):
user_id: int
name: str
age: int
# 辞書を使ったデシリアライズ(バリデーションを伴う)
user_data = {"user_id": 1, "name": "Charlie", "age": 40}
validated_user = User(**user_data) # デシリアライズ
print(validated_user)
print(f"型: {type(validated_user)}") # 型を出力
# 出力: user_id=1 name='Charlie' age=40
# 型: <class '__main__.User'>

辞書に対してバリデーションを実行すると同時にデータモデルインスタンスに変換する。
バリデーションに成功すると、データモデルインスタンスが返却される ※失敗すると例外が発生する

JSONからデータモデルインスタンスに変換

デシリアライズ2
from pydantic import BaseModel
# Pydanticデータモデル
class User(BaseModel):
user_id: int
name: str
age: int
# JSON文字列を使ったデシリアライズ(バリデーションを伴う)
user_json = '{"user_id": 2, "name": "Alice", "age": 30}'
validated_user_from_json = User.model_validate_json(user_json) # デシリアライズ
print(validated_user_from_json)
print(f"型: {type(validated_user_from_json)}") # 型を出力
# 出力: user_id=2 name='Alice' age=30
# 型: <class '__main__.User'>

JSON文字列に対してバリデーションを実行すると同時にデータモデルインスタンスに変換する。
バリデーションに成功すると、データモデルインスタンスが返却される ※失敗すると例外が発生する

辞書からJSONに変換

辞書からJSONに変換する場合はpython標準のjsonをimportして使う

json.loads
import json
from pydantic import BaseModel
# Pydanticデータモデル
class User(BaseModel):
user_id: int
name: str
age: int
# JSON文字列を使ったデシリアライズ
user_json = '{"user_id": 2, "name": "Alice", "age": 30}'
user_dict = json.loads(user_json)
print(user_dict)
print(f"型: {type(user_dict)}") # 型を出力
# 出力: {'user_id': 2, 'name': 'Alice', 'age': 30}
# 型: <class 'dict'>

fastApiとFlaskについて

上記のシリアライズやデシリアライズはfastApiを使っている場合は
pydanticのインストールは不要だが、Flaskの場合はpydanticのインストールが必要になる。

まとめ

REST APIを実装する際に返却時のデータ型を意識する必要があり、
それぞれの変換方法を忘れるのでまとめておいた。

FastApiでREST APIを作る時はデータ型によってはバリデーションが
実行されなかったりするので注意が必要。

その辺は

下記記事で書いてます

関連記事

新着記事

タグ別一覧
top