Python Marshmallow:字典验证错误
Python Marshmallow: Dict validation Error
我对 marshmallow 很陌生,但我的问题是关于处理类似 dict 的对象的问题。 Marshmallow 文档中没有可行的示例。我在堆栈溢出 中遇到了一个简单的例子,这是答案的原始代码假设这应该很简单
from marshmallow import Schema, fields, post_load, pprint
class UserSchema(Schema):
name = fields.String()
email = fields.Email()
friends = fields.List(fields.String())
class AddressBookSchema(Schema):
contacts =fields.Dict(keys=fields.String(),values=fields.Nested(UserSchema))
@post_load
def trans_friends(self, item):
for name in item['contacts']:
item['contacts'][name]['friends'] = [item['contacts'][n] for n in item['contacts'][name]['friends']]
data = """
{"contacts": {
"Steve": {
"name": "Steve",
"email": "steve@example.com",
"friends": ["Mike"]
},
"Mike": {
"name": "Mike",
"email": "mike@example.com",
"friends": []
}
}
}
"""
deserialized_data = AddressBookSchema().loads(data)
pprint(deserialized_data)
但是,当我 运行 代码时,我得到以下 NoneType 值
`None`
输入尚未编组。
我使用的是 marshmallow 3.0.0b20 的最新测试版。即使它看起来很简单,我也找不到使它起作用的方法。该信息似乎表明框架正在处理嵌套字典。
目前我正在为 flask 开发一个编目应用程序,我收到了 JSON 消息,我无法事先真正指定架构。我的具体问题如下:
data = """
{"book": {
"title": {
"english": "Don Quixiote",
"spanish": "Don Quijote"
},
"author": {
"first_name": "Miguel",
"last_name": "Cervantes de Saavedra"
}
},
"book": {
"title": {
"english": "20000 Leagues Under The Sea",
"french": "20000 Lieues Sous Le Mer",
"japanese": "海の下で20000リーグ",
"spanish": "20000 Leguas Bajo El Mar",
"german": "20000 Meilen unter dem Meeresspiegel",
"russian": "20000 лиг под водой"
},
"author": {
"first_name": "Jules",
"last_name": "Verne"
}
}
}
这只是玩具数据,但举例说明字典中的键不是固定的,它们的数字和文本会发生变化。
所以问题是为什么我在一个已经工作的简单示例中收到验证错误,以及是否可以使用 marshmallow 框架来验证我的数据,
谢谢
您的代码中有两个问题。
首先是post_load装饰器的缩进。你这里复制代码的时候引入了,但是你的代码里没有运行,不然得不到None
.
第二个是由于棉花糖 3 中的 documented 更改。pre/post_load/dump 函数预期 return 值而不是改变它。
这是一个工作版本。我还修改了装饰器:
from marshmallow import Schema, fields, post_load, pprint
class UserSchema(Schema):
name = fields.String()
email = fields.Email()
friends = fields.List(fields.String())
class AddressBookSchema(Schema):
contacts = fields.Dict(keys=fields.String(),values=fields.Nested(UserSchema))
@post_load
def trans_friends(self, item):
for contact in item['contacts'].values():
contact['friends'] = [item['contacts'][n] for n in contact['friends']]
return item
data = """
{
"contacts": {
"Steve": {
"name": "Steve",
"email": "steve@example.com",
"friends": ["Mike"]
},
"Mike": {
"name": "Mike",
"email": "mike@example.com",
"friends": []
}
}
}
"""
deserialized_data = AddressBookSchema().loads(data)
pprint(deserialized_data)
最后,marshmallow 2 中的 Dict
没有 key/value 验证功能,因此它会默默地忽略 keys
和 values
参数并执行没有验证。
我对 marshmallow 很陌生,但我的问题是关于处理类似 dict 的对象的问题。 Marshmallow 文档中没有可行的示例。我在堆栈溢出
from marshmallow import Schema, fields, post_load, pprint
class UserSchema(Schema):
name = fields.String()
email = fields.Email()
friends = fields.List(fields.String())
class AddressBookSchema(Schema):
contacts =fields.Dict(keys=fields.String(),values=fields.Nested(UserSchema))
@post_load
def trans_friends(self, item):
for name in item['contacts']:
item['contacts'][name]['friends'] = [item['contacts'][n] for n in item['contacts'][name]['friends']]
data = """
{"contacts": {
"Steve": {
"name": "Steve",
"email": "steve@example.com",
"friends": ["Mike"]
},
"Mike": {
"name": "Mike",
"email": "mike@example.com",
"friends": []
}
}
}
"""
deserialized_data = AddressBookSchema().loads(data)
pprint(deserialized_data)
但是,当我 运行 代码时,我得到以下 NoneType 值
`None`
输入尚未编组。
我使用的是 marshmallow 3.0.0b20 的最新测试版。即使它看起来很简单,我也找不到使它起作用的方法。该信息似乎表明框架正在处理嵌套字典。
目前我正在为 flask 开发一个编目应用程序,我收到了 JSON 消息,我无法事先真正指定架构。我的具体问题如下:
data = """
{"book": {
"title": {
"english": "Don Quixiote",
"spanish": "Don Quijote"
},
"author": {
"first_name": "Miguel",
"last_name": "Cervantes de Saavedra"
}
},
"book": {
"title": {
"english": "20000 Leagues Under The Sea",
"french": "20000 Lieues Sous Le Mer",
"japanese": "海の下で20000リーグ",
"spanish": "20000 Leguas Bajo El Mar",
"german": "20000 Meilen unter dem Meeresspiegel",
"russian": "20000 лиг под водой"
},
"author": {
"first_name": "Jules",
"last_name": "Verne"
}
}
}
这只是玩具数据,但举例说明字典中的键不是固定的,它们的数字和文本会发生变化。
所以问题是为什么我在一个已经工作的简单示例中收到验证错误,以及是否可以使用 marshmallow 框架来验证我的数据,
谢谢
您的代码中有两个问题。
首先是post_load装饰器的缩进。你这里复制代码的时候引入了,但是你的代码里没有运行,不然得不到None
.
第二个是由于棉花糖 3 中的 documented 更改。pre/post_load/dump 函数预期 return 值而不是改变它。
这是一个工作版本。我还修改了装饰器:
from marshmallow import Schema, fields, post_load, pprint
class UserSchema(Schema):
name = fields.String()
email = fields.Email()
friends = fields.List(fields.String())
class AddressBookSchema(Schema):
contacts = fields.Dict(keys=fields.String(),values=fields.Nested(UserSchema))
@post_load
def trans_friends(self, item):
for contact in item['contacts'].values():
contact['friends'] = [item['contacts'][n] for n in contact['friends']]
return item
data = """
{
"contacts": {
"Steve": {
"name": "Steve",
"email": "steve@example.com",
"friends": ["Mike"]
},
"Mike": {
"name": "Mike",
"email": "mike@example.com",
"friends": []
}
}
}
"""
deserialized_data = AddressBookSchema().loads(data)
pprint(deserialized_data)
最后,marshmallow 2 中的 Dict
没有 key/value 验证功能,因此它会默默地忽略 keys
和 values
参数并执行没有验证。