Python Marshmallow对象列表验证Schema问题排查
你的Marshmallow Schema代码存在以下3个关键错误:
1. 非法的JSON字符串格式
你定义的data字符串不符合JSON规范:JSON要求所有键必须用双引号包裹,但value未使用双引号,导致该字符串无法被json.loads()正确解析。
修复方法:给value加上双引号,让整个字符串成为合法JSON:
data = '{"value": [{"path" : "libs/shared/components/shortcuts/src/lib/shortcuts.component.ts", "content_match_count" : 3},{"path" : "libs/shared/components/shortcuts/src/lib/shortcuts.module.ts", "content_match_count" : 5}]}'
2. 错误使用many=True参数
many=True用于解析顶层为数组的数据(比如[{}, {}, ...]),但你的数据结构是单个对象,其中value字段才是数组。加上many=True会让Marshmallow把整个输入当成对象数组解析,完全不匹配你的数据结构。
修复方法:去掉many=True:
schema_data = MyResponseSchema().load(parsed_data)
3. 直接传入JSON字符串给load()方法
Marshmallow的load()方法接收的是Python字典,而非JSON字符串。直接传字符串会导致Marshmallow尝试遍历字符串字符,引发类型错误。
修复方法:先用json.loads()把JSON字符串解析成Python字典:
parsed_data = json.loads(data) schema_data = MyResponseSchema().load(parsed_data)
完整修复后的代码:
from marshmallow import Schema, fields, post_load import json class MyResponseDataSchema(Schema): path = fields.Str(required=False) content_match_count = fields.Int(required=False) class MyResponseSchema(Schema): value = fields.List( fields.Nested(MyResponseDataSchema), required=False, ) # 修正后的合法JSON字符串 data = '{"value": [{"path" : "libs/shared/components/shortcuts/src/lib/shortcuts.component.ts", "content_match_count" : 3},{"path" : "libs/shared/components/shortcuts/src/lib/shortcuts.module.ts", "content_match_count" : 5}]}' # 解析JSON为字典 parsed_data = json.loads(data) # 去掉many=True,正确加载数据 schema_data = MyResponseSchema().load(parsed_data) print(schema_data)
内容的提问来源于stack exchange,提问作者user13841758
相关产品推荐
相关产品推荐

