try 使用PYDANIC对json文件建模,如下所示:
{
"people": {
"Jack": {"age": 32, "postcode": 1223},
"Robert": {"age": 23, "postcode":2354},
"Sarah": {"age": 55, "postcode":5673}
}
}
我还有一个我喜欢强制执行的可接受名称的列表:
accepted_names = ["Jack", "Robert", "Sarah", "Alex"]
我曾try 使用__root__:[Dict[str, Dict[str, int]]
,但在版本2中不建议使用,错误消息说我应该使用RootModel
,但pydatics文档并不清楚如何做到这一点.
到目前为止,我所拥有的是:
import json
from pydantic import BaseModel, RootModel, conint
from typing import Dict
class PersonModel(BaseModel):
age: conint(ge=0)
postcode: conint(ge=1000, le=9999)
class MyModel(RootModel):
root:Dict[str, PersonModel]
def validate_root(cls, v):
acceptable_names = ["Jack", "Robert", "Sarah", "Alex"]
if v not in acceptable_names:
raise ValueError(f"Names should be one of {', '.join(acceptable_names)}")
return v
class ParentModel(BaseModel):
people: MyModel
file = "scratch/test.json"
with open(file, "r") as f:
data = json.load(f)
mymodel = ParentModel(**data)
但它现在的工作方式是mymodel.people.root['Jack']
,而我想要mymodel.people.Jack