Json 到带有 marshmellow 的对象列表 Python

Json to list of objects with marshmellow Python

我有 json 关于我的对象的数据 我创建了将其序列化为对象列表的模式,但它不起作用

架构:

from marshmellow import fields, Schema

class ContactSchema(Schema):
    first_name = fields.String(attribute="ftNm")
    last_name = fields.String(attribute="ltNm")
    phone = fields.Integer(attribute="pn")

型号:

class Contact:
    id: int
    first_name: str
    last_name: str
    phone: str

我有一个转换功能(但不工作)

def json_to_list():
    json = [{'ftNm': 'Name1', 'ltNm': 'Surname1', 'pn': 343434},
            {'ftNm': 'Name2', 'ltNm': 'Surname2', 'pn': 141414}, 
            {'ftNm': 'Name3', 'ltNm': 'Surname3', 'pn': 656565}]

    schema = ContactSchema()
    result = schema.dump(json)

如果有人帮助我将 json 转换为对象列表的功能,我将不胜感激

我不确定你的意图是什么。但是,可以通过以下方式进行序列化和反序列化。

通过重命名变量名指定的属性进行序列化和反序列化。

from marshmallow import Schema, fields
    
class ContactSchema(Schema):
    first_name = fields.Str(attribute="ftNm", data_key="ftNm")
    last_name = fields.Str(attribute="ltNm", data_key="ltNm")
    phone = fields.Integer(attribute="pn", data_key="pn")

# serialization to json
def from_list():
    data = [
        {'ftNm': 'Name1', 'ltNm': 'Surname1', 'pn': 343434},
        {'ftNm': 'Name2', 'ltNm': 'Surname2', 'pn': 141414},
        {'ftNm': 'Name3', 'ltNm': 'Surname3', 'pn': 656565}
    ]
    schema = ContactSchema(many=True)
    return schema.dump(data)

# deserialization from json
def to_list():
    json = [
        {'ftNm': 'Name1', 'ltNm': 'Surname1', 'pn': 343434},
        {'ftNm': 'Name2', 'ltNm': 'Surname2', 'pn': 141414},
        {'ftNm': 'Name3', 'ltNm': 'Surname3', 'pn': 656565}
    ]
    schema = ContactSchema(many=True)
    return schema.load(json)

不重命名变量名指定的属性的反序列化。

class ContactSchema(Schema):
    first_name = fields.Str(attribute="ftNm")
    last_name = fields.Str(attribute="ltNm")
    phone = fields.Integer(attribute="pn")

# deserialization from json
def to_list():
    json = [
        {'first_name': 'Name1', 'last_name': 'Surname1', 'phone': 343434},
        {'first_name': 'Name2', 'last_name': 'Surname2', 'phone': 141414},
        {'first_name': 'Name3', 'last_name': 'Surname3', 'phone': 656565}
    ]
    schema = ContactSchema(many=True)
    return schema.load(json)

可能未正确指示转换方向。

from marshmallow import Schema, fields, post_load
from dataclasses import dataclass

@dataclass
class Contact:
    # id: int
    first_name: str
    last_name: str
    phone: str

class ContactSchema(Schema):
    first_name = fields.Str(data_key="ftNm")
    last_name = fields.Str(data_key="ltNm")
    phone = fields.Integer(data_key="pn")

    @post_load
    def make_user(self, data, **kwargs):
        return Contact(**data)

# deserialization from json
def to_list():
    json = [
        {'ftNm': 'Name1', 'ltNm': 'Surname1', 'pn': 343434},
        {'ftNm': 'Name2', 'ltNm': 'Surname2', 'pn': 141414},
        {'ftNm': 'Name3', 'ltNm': 'Surname3', 'pn': 656565}
    ]
    schema = ContactSchema(many=True)
    return schema.load(json)

要序列化和反序列化数据库模型,我建议 flask-marshmallow and marshmallow-sqlalchemy

我不知道是否正常,但我只是创建了一个简单的函数并通过循环反序列化

    def create(self, json: dict):
        key = Key()
        key.id = json.get("id")
        key.key_number = json.get("num")
        key.hash = json.get("hash")

        return key