终端默认只显示ValidationError首行,关键字段信息被折叠;应改用print(e.errors())获取结构化错误列表,含loc(路径)、msg(原因)、type(类型),或用json.dumps(e.errors(), indent=2)美化输出。

终端报错里找不到具体字段名?检查 ValidationError 的字符串格式
Pydantic v2 默认的 ValidationError 输出是扁平化、多行结构,但 VSCode 终端默认只显示第一行(如 1 validation error for ClinicalObservation),关键字段信息被折叠。这不是 bug,而是输出样式问题。
- 在
validate_on_save.py中捕获异常后,别直接print(e),改用print(e.errors())—— 它返回结构化列表,每项含loc(字段路径)、msg(错误原因)、type(校验类型) - 例如
e.errors()[0]["loc"]可能是["code"]或["value"],甚至嵌套如["items", 0, "id"],直接对应编辑器里出错的 JSON 路径 - 如果终端仍换行混乱,加一句
import json; print(json.dumps(e.errors(), indent=2)),强制美化输出
model_validate() 报错不跳转到源码?VSCode 不识别 JSON 文件中的错误位置
VSCode 的 Problems 面板只解析 Python 源码里的语法/类型错误,对 JSON 文件中 Pydantic 校验失败的字段**不做行号映射**——它根本不知道 "code": "LOINC-123" 在第 5 行第 12 列有问题。
- 解决方案不是让 VSCode “自动跳转”,而是把校验结果转成可点击的伪链接格式:在
print前拼接f"{json_file}:{line_num}:{col_num}"(需提前解析 JSON 并定位字段位置) - 更轻量的做法:用
json.loads()后手动提取e.errors()[0]["loc"],再用 Python 的json.JSONDecoder().scan_once或第三方库jsonpath-ng定位该字段在原始字符串中的偏移量,最后换算成行列号 - 别依赖
vscode-json插件的“Go to Definition”——它只处理 schema 引用,不处理运行时校验失败
为什么终端显示 ValidationError 却没红色波浪线?语言模式和文件关联没配对
VSCode 的 Problems 面板只响应当前激活语言服务的诊断信息。JSON 文件默认用内置 JSON 支持,而 Pydantic 校验是 Python 进程跑的,二者完全隔离。
- 确保
.vscode/settings.json里有"files.associations": {"*.clinical.json": "json"}—— 这让 VSCode 用 JSON 语言服务高亮语法,但**不触发 Pydantic 校验** - 真正起作用的是保存钩子脚本:必须配置
"files.autoSave": "onFocusChange"+"editor.codeActionsOnSave": {"source.organizeImports": true}(哪怕不组织导入,这个开关是触发保存钩子的前提) - 如果终端有报错但 Problems 面板空白,检查右下角状态栏是否显示
JSON(不是Plain Text);若显示Plain Text,点它手动选JSON
嵌套模型校验失败时,loc 字段路径难读?用 str(e) 代替 e.errors() 反而更直观
当模型含多层嵌套(比如 class Patient(BaseModel): address: Address),e.errors() 返回的 loc 是元组 ("address", "city"),但终端里看不到上下文;而 str(e) 会生成带缩进的树状文本,字段层级一目了然。
立即学习“Python免费学习笔记(深入)”;
- 实测对比:
str(e)输出类似: -
patient -> address -> city
→field required - 而
e.errors()输出是[{"loc": ["patient", "address", "city"], ...}],需人工拼接 - 调试阶段优先用
print(str(e));CI 或日志场景再切回e.errors()做结构化解析
loc 路径、原始 JSON 字符串、行列偏移三者串起来,而不是等工具自动补全。


















