You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pydantic BaseModel schema与实例序列化/反序列化异常排查

问题排查与解决方案

核心错误原因

你遇到的问题大概率是以下两种情况之一:

  1. 错误地将整个JSON Schema直接传给create_model:Pydantic的create_model需要的是字段名到字段类型/定义的映射,而非完整的JSON Schema结构。如果直接把包含title、properties等键的schema字典传入,会生成一个以这些schema元数据为字段的模型,而非你预期的MainModel。
  2. 加载数据后未用生成的模型实例化,直接打印了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:03:32