メインコンテンツまでスキップ

model_dump_jsonはstrを返す

· 約2分
Nodashin
Software Engineer

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)