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

如何用Python的Marshmallow验证JSON字典列表?嵌套验证报错排查

Marshmallow验证问题解答:列表与嵌套数据处理

错误原因分析

你遇到的{'_schema': ['Invalid input type.']}错误,本质是数据结构与Schema定义不匹配:

  • AuthDataSchema定义的是包含data字段的字典结构(data是嵌套列表)
  • 但你传入的data是直接的列表,不符合Schema要求的字典类型,导致校验失败。

修正方案(两种可选)

方案1:调整数据结构,匹配Schema定义

保持原有Schema不变,给列表套一层带data键的字典:

from marshmallow import Schema, fields, validate 

class AuthUserSchema(Schema):
    user = fields.String(required=True)  # 建议添加required确保必填字段存在
    password = fields.String(required=True)
    enabled = fields.Boolean(required=True)

class AuthDataSchema(Schema):
    data = fields.List(fields.Nested(AuthUserSchema))

# 调整为带data键的字典结构
data = {
    "data": [
        {"enabled": True, "password": "6e5b5410415bde", "user": "admin"},
        {"enabled": True, "password": "4e5b5410415bde", "user": "guest"},
    ]
}

schema = AuthDataSchema()
errors = schema.validate(data)
print(errors)  # 输出空字典,验证通过

方案2:调整Schema,直接验证列表

如果原始数据就是纯列表(不需要外层字典),可以直接定义验证列表的Schema:

from marshmallow import Schema, fields, validate 

class AuthUserSchema(Schema):
    user = fields.String(required=True)
    password = fields.String(required=True)
    enabled = fields.Boolean(required=True)

# 直接验证顶层列表的Schema
class AuthListSchema(Schema):
    _schema = fields.List(fields.Nested(AuthUserSchema))

data = [
    {"enabled": True, "password": "6e5b5410415bde", "user": "admin"},
    {"enabled": True, "password": "4e5b5410415bde", "user": "guest"},
]

schema = AuthListSchema()
errors = schema.validate(data)
print(errors)  # 验证通过

问题1:如何验证由字典组成的JSON列表?

分两种场景处理:

  1. 纯列表数据:参考方案2,要么定义包含_schema字段的Schema(用于顶层列表验证),要么直接调用fields.List的validate方法。
  2. 带外层键的列表:参考方案1,定义包含列表字段的Schema,传入对应结构的字典即可。

额外提示:可以给字段添加validate参数做细粒度校验,比如限制密码长度:

password = fields.String(required=True, validate=validate.Length(min=8))

问题2:如何验证嵌套JSON数据?

Marshmallow通过fields.Nested实现嵌套验证,核心步骤:

  1. 定义内层数据的Schema(比如AuthUserSchema)
  2. 在顶层Schema中,用fields.Nested(内层Schema)作为字段类型,支持单个嵌套对象或嵌套对象列表:

场景1:单个嵌套对象

class AddressSchema(Schema):
    street = fields.String()
    city = fields.String()

class UserSchema(Schema):
    name = fields.String()
    address = fields.Nested(AddressSchema)  # 单个嵌套对象

data = {
    "name": "Alice",
    "address": {"street": "Main St", "city": "NYC"}
}

schema = UserSchema()
errors = schema.validate(data)

场景2:嵌套对象列表

即你最初尝试的场景,用fields.List(fields.Nested(内层Schema))定义列表类型的嵌套字段,注意匹配传入的数据结构即可。


内容的提问来源于stack exchange,提问作者Nir Vana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:17:13