Pydantic BaseModel schema与实例序列化/反序列化异常排查
问题排查与解决方案
核心错误原因
你遇到的问题大概率是以下两种情况之一:
- 错误地将整个JSON Schema直接传给
create_model:Pydantic的create_model需要的是字段名到字段类型/定义的映射,而非完整的JSON Schema结构。如果直接把包含title、properties等键的schema字典传入,会生成一个以这些schema元数据为字段的模型,而非你预期的MainModel。 - 加载数据后未用生成的模型实例化,直接打印了schema:代码中误输出了schema变量,而非解析后的模型实例数据。
分步排查与修正
第一步:确认test_save.py的序列化逻辑(参考正确示例)
先确保你的序列化代码是正确的,比如:
# test_save.py from pydantic import BaseModel import json class MainModel(BaseModel): foo: str # 序列化模型Schema with open("model.json", "w", encoding="utf-8") as f: json.dump(MainModel.model_json_schema(), f, indent=2) # 序列化模型实例 instance = MainModel(foo="bar") with open("data.json", "w", encoding="utf-8") as f: json.dump(instance.model_dump(), f, indent=2)
第二步:修正test_load.py的加载逻辑
根据你使用的Pydantic版本,选择对应的正确写法:
情况1:使用Pydantic v2(推荐)
v2提供了直接从JSON Schema创建模型的from_json_schema方法,无需手动处理schema结构:
# test_load.py from pydantic import BaseModel import json # 读取并加载Schema创建模型 with open("model.json", "r", encoding="utf-8") as f: schema_content = f.read() MainModel = BaseModel.from_json_schema(schema_content) # 读取数据并实例化模型 with open("data.json", "r", encoding="utf-8") as f: data = json.load(f) instance = MainModel(**data) print(instance.model_dump()) # 输出: {"foo": "bar"}
情况2:使用Pydantic v1
v1没有内置的JSON Schema转模型方法,需要手动提取properties字段并映射类型:
# test_load.py from pydantic import create_model, Field import json # 读取Schema并提取字段定义 with open("model.json", "r", encoding="utf-8") as f: schema = json.load(f) # 映射JSON Schema类型到Python类型 type_mapping = { "string": str, "integer": int, "boolean": bool, "object": dict, "array": list } # 构建create_model所需的字段参数 fields = {} for field_name, props in schema["properties"].items(): field_type = type_mapping.get(props["type"], str) # 处理默认值(如果有) default_value = props.get("default", ...) fields[field_name] = (field_type, Field(default=default_value)) # 创建模型 MainModel = create_model("MainModel", **fields) # 读取数据并实例化 with open("data.json", "r", encoding="utf-8") as f: data = json.load(f) instance = MainModel(**data) print(instance.dict()) # 输出: {"foo": "bar"}
第三步:排查常见代码错误
检查你的test_load.py是否存在以下错误写法:
# 错误示例1:直接将完整Schema传入create_model with open("model.json", "r") as f: schema = json.load(f) MainModel = create_model("MainModel", **schema) # 错误:用schema元数据当字段 instance = MainModel(**data) print(instance.model_dump()) # 输出schema结构而非数据 # 错误示例2:误打印schema变量而非实例 print(schema) # 错误:直接输出schema,不是解析后的实例数据
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

