我需要反序列化此JSON:
{
"emails": {
"items": [
{
"id": 1,
"email": "john@doe.com"
},
{
"id": 2,
"email": "jane@doe.com"
}
]
}
}
使用棉花糖进入该对象:
{
"emails": [
{
"id": 1,
"email": "john@doe.com"
},
{
"id": 2,
"email": "jane@doe.com"
}
]
}
我该怎么办?
我尝试过这种方式,发现更直观,但没有用:
class Phone(OrderedSchema):
id = fields.Int()
email = fields.Str()
class Contact(Schema):
key = fields.Str()
phones = fields.Nested(Phone, load_from='phones.list', many=True)
答案 0 :(得分:1)
使用以下代码,我使用Dict和Nested:
from marshmallow import Schema, fields, post_load
class Contact(Schema):
"""Schema for emails."""
# Define subschema for serializing each item
class Item(Schema):
"""Subclass for each item."""
id = fields.Integer(required=True)
email = fields.Email(required=True)
# Define the fields in the main schema, here we define "emails" as a dict that accepts
# strings for keys and list of Item(Schema) as values
emails = fields.Dict(keys=fields.String(), values=fields.Nested(Item, many=True))
# Define the way you want the schema to return the data
@post_load
def deserialize(self, data, **kwargs):
"""Deserialize in an specific way."""
# post_load needs to return the data that the schema will return after deserialization
return {
"emails": [item for item in data["emails"]["items"]]
}
Contact().load({
"emails": {
"items": [
{
"id": 1,
"email": "john@doe.com"
},
{
"id": 2,
"email": "jane@doe.com"
}
]
}
})
# Returns
#{'emails': [{'email': 'john@doe.com', 'id': 1},
# {'email': 'jane@doe.com', 'id': 2}]}