Marshmallow 的 dump 与 load 各做了什么?错误信息长什么样?未知字段怎么处理?类型转换有多宽松?性能代价有多大?这篇逐项运行并打印每种情况的结果。
{"id": 1, "name": "ann", "email": "ann@x.test", "created": "2026-01-02T03:04:05", "balance": "10.50", "display": "ann <ann@x.test>", "posts": [], "fullName": "ann"}
对象上的 secret、password 属性: False / False (没声明或 load_only 的不会泄漏)
data_key 改名:fullName = ann | Method 字段 display = ann <ann@x.test> | Decimal as_string: '10.50' | 日期: 2026-01-02T03:04:05上一篇:OpenAPI 文档生成;下一篇:Pydantic 在 Flask 中的使用。
合法输入 → {'name': 'bob', 'email': 'b@x.test', 'password': 'pw', 'balance': Decimal('3.14')}
什么都没给 → {"name": ["Missing data for required field."], "email": ["Missing data for required field."], "password": ["Missing data for required field."]}
多个字段同时出错 → {"name": ["Length must be between 1 and 20."], "email": ["Not a valid email address."]}
类型不对(name 是数字) → {"name": ["Not a valid string."]}
嵌套的 posts 有错 → {"posts": {"1": {"title": ["Missing data for required field."]}}}
传了 dump_only 的 id → {"id": ["Unknown field."]} RAISE(默认) → {"extra": ["Unknown field."]}
EXCLUDE → 通过 {'name': 'a', 'email': 'a@x.test', 'password': 'pw'}
INCLUDE → 通过 {'name': 'a', 'email': 'a@x.test', 'password': 'pw', 'extra': 1} partial=True 只给 name → 通过 {'name': 'zed'}
pre_load 去空格转小写 + post_load 构造对象 → Range ann
validates 拒绝 admin → {"name": ["保留名"]}
validates_schema 跨字段 → {"start": ["start 必须小于等于 end"]}5 → 5 '5' → 5 '5.0' 错误 Not a valid integer. 5.0 → 5 5.5 → 5 True 错误 Not a valid integer. 'abc' 错误 Not a valid integer. None 错误 Field may not be null. ' 7 ' → 7
marshmallow dump 16.5 ms;手写字典推导 0.7 ms;约 23 倍