我对棉花糖还不太熟悉,但我的问题是如何处理类似dict的对象。棉花糖文档中没有可行的示例。我在stack overflowOriginal question中遇到了一个简单的例子,这是最初的代码
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": "[email protected]",
"friends": ["Mike"]
},
"Mike": {
"name": "Mike",
"email": "[email protected]",
"friends": []
}
}
}
"""
deserialized_data = AddressBookSchema().loads(data)
pprint(deserialized_data)
但是,当我运行代码时,会得到以下非类型值
`None`
输入尚未整理。
我正在使用棉花糖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"
}
}
}
这只是一个玩具数据,但举例说明字典中的键不是固定的,它们在数字和文本上都会发生变化。
所以问题是为什么我会在一个简单的例子中得到验证错误,如果可以使用棉花糖框架来验证我的数据,
谢谢
最佳答案
代码中有两个问题。
第一个是post_load decorator的缩进。您在这里复制代码时引入了它,但是您运行的代码中没有它,否则您将不会得到None
。
第二个原因是棉花糖3的adocumented变化。预/后加载/转储函数应返回该值,而不是对其进行更改。
这是一个有效的版本我还重新设计了装潢师:
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": "[email protected]",
"friends": ["Mike"]
},
"Mike": {
"name": "Mike",
"email": "[email protected]",
"friends": []
}
}
}
"""
deserialized_data = AddressBookSchema().loads(data)
pprint(deserialized_data)
最后,marshmallow 2中的
Dict
没有键/值验证功能,因此它将静默地忽略keys
和values
参数,而不执行验证。关于python - Python棉花糖:字典验证错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53255317/