model_dump_jsonはstrを返す
· 約2分
pydantic.BaseModel.model_dump_json()
は、dict
ではなく、str
を返す。
そのため、Fileの書き込みはjsonモジュールではなく、printでおk。
pydantic.BaseModel.model_dump()
の課題として、Enum型で定義した型をjsonに変換するときに、Errorが発生することがあります。
from enum import Enum
from pydantic import BaseModel
class Department(Enum):
HR = "HumanResources"
IT = "InformationTechnology"
SALES = "Sales"
class Person(BaseModel):
name: str
age: int
department: Department
class Team(BaseModel):
name: str
people: list[Person]
team = Team(
name="Development",
people=[
Person(name="Alice", age=30, department=Department.IT),
Person(name="Bob", age=24, department=Department.HR),
]
)
書き込み
pydantic.BaseModel.model_dump_json()
を使うと、Enum型がそのまま利用できます。ただし、返り値が文字列型で帰ってくるため、jsonモジュールではなく、printで書き込む必要があります。
success
これは実行可能
with open("team.json", "w") as f:
f.write(team.model_dump_json())
警告
次のエラーが出る
TypeError: Object of type Department is not JSON serializable
with open("team.json", "w") as f:
json.dump(team.model_dump(), f)
読み込み
読み込むときは、json
で読み込めます。
※f.read()
でstr
で読み込んで、pydantic.BaseModel
への変換も可能
# 例
team_json_str = team.model_dump_json()
# write
with open("team.json", "w") as f:
f.write(team_json_str)
# read
import json
with open("team.json", "r") as f:
team_data = json.load(f)
team_obj = Team(**team_data)
print(team_obj)