Python棉花糖:Dict验证错误



我对棉花糖很陌生,但我的问题是处理dict类对象的问题。在棉花糖文件中没有可行的例子。我在堆栈溢出中遇到了一个简单的例子原始问题,这是答案的原始代码假设这应该是非常简单的

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`

尚未整理输入。

我使用的是棉花糖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装饰器的缩进。您在这里复制代码时引入了它,但您正在运行的代码中没有它,否则您将无法获得None

第二个原因是有文件记载的棉花糖3的变化。pre/post_load/dump函数应该返回值,而不是对其进行变异

这是一个工作版本。我还重新设计了装饰器:

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)

最后,棉花糖2中的Dict没有键/值验证功能,因此它将默默地忽略keysvalues参数,不执行验证。

最新更新