如何使用棉花糖序列化嵌套词典?

时间:2018-12-23 18:04:13

标签: python-3.x dictionary flask flask-sqlalchemy marshmallow

我是棉花糖和烧瓶等的新手。 我正在尝试通过创建使用jsonified python字典的API进行学习。字典包含这样的嵌套字典。它还包含一些Null项。

{
    "TITLE": "XXX",
    "NAME": "Mongoose",
    "TIME": "0430",
    "USED": null,
    "DESCRIPTION": "",
    "WEAPONS": {
        "HEAT": "Israel",
        "RADAR": "Flat",
        "CONV": {
            "S": true,
            "N": false,
            "A": false
         },
    },
}

我只是想将其消耗回字典类型。在POST操作中这样的事情

fields_schema = FieldSchema(many=True)
field_schema = FieldSchema()

json_data = request.get_json(force=True)
if not json_data:
    return {'message': 'No input data provided'}, 400
# Validate and deserialize input
try:
    data = field_schema.load(json_data)
except ValidationError as e:
    return e.messages, 422

数据只是嵌套字典。

它正在定义导致我出现问题的架构类。 据我所知,当定义架构时,棉花糖没有JSON类型,当我使用字段时.Dict我收到以下错误:

{
    "meta": [
        "Missing data for required field."
    ],
    "TITLE": [
        "Unknown field."
    etc...

我不确定是应该使用嵌套模式还是要完全解决复杂问题。

我的fields_schema当前如下所示:

class FieldSchema(ma.Schema):
    id = fields.Integer()
    meta = fields.Dict(required=True)

任何指针将不胜感激

1 个答案:

答案 0 :(得分:2)

如果要验证嵌套对象,则可以使用棉花糖的fields.Nested功能。

使用他们的示例

from marshmallow import Schema, fields, pprint

class UserSchema(Schema):
    name = fields.String()
    email = fields.Email()
    created_at = fields.DateTime()

class BlogSchema(Schema):
    title = fields.String()
    author = fields.Nested(UserSchema)

user = User(name="Monty", email="monty@python.org")
blog = Blog(title="Something Completely Different", author=user)
result = BlogSchema().dump(blog)
pprint(result)
# {'title': u'Something Completely Different',
#  'author': {'name': u'Monty',
#             'email': u'monty@python.org',
#             'created_at': '2014-08-17T14:58:57.600623+00:00'}}

尽管如此,您仍需要从根文档中定义模式。像

class Widget(Schema):
    TITLE = fields.String()
    NAME = fields.String()
    # ...
    WEAPONS = fields.Nested(Weapon)

class Weapon(Schema):
    HEAT = fields.String()
    # ...

可能会帮助您