首页 > 解决方案 > 从 JSON 以编程方式分配类属性的最佳方法

问题描述

我正在制作的程序需要根据以 JSON 形式接收的信息,使用 SQLAlchemy 将用户存储在 SQLite 数据库中。我对用户的类定义是:

class User(Base):
    __tablename__ = "users"

    address = Column(TEXT, primary_key=True)
    fullName = Column(TEXT)
    nickName = Column(TEXT)
    profilePictureId = Column(INTEGER)
    bio = Column(TEXT)
    online = Column(INTEGER)
    lastSeen = Column(TEXT)
    publicKey = Column(TEXT)

我将收到的 JSON 示例是:

{
    "address": "aayla",
    "publicKey": "key",
    "bio" = "test bio",
}

这是我现在创建新User对象的方式:

newUser = User(
    address = data["address"]
    publicKey = data["publicKey"]
    ...
)

我想做的是User使用同名的 JSON 键的值自动填充我的类的属性。尽管我目前正在做的事情确实有效,但如果可能的话,我宁愿使用更加程序化的方法,以便在User添加/更改事件属性时减少范围蔓延的痛苦。是否存在更自动的方式?

标签: pythonjsonsqlitesqlalchemy

解决方案


这与 JSON 无关,至少在您将 JSON 解码为 Python 后不会dict。完成此操作后,您可以简单地将值作为关键字参数传递(因为您的参数名称与原始 JSON 键匹配):

newUser = User(**data)

但是,这有点脆弱,除非您首先验证键名是有效参数。最好将其封装在类方法中。

class User(Base):
    __tablename__ = "users"

    address = Column(TEXT, primary_key=True)
    fullName = Column(TEXT)
    nickName = Column(TEXT)
    profilePictureId = Column(INTEGER)
    bio = Column(TEXT)
    online = Column(INTEGER)
    lastSeen = Column(TEXT)
    publicKey = Column(TEXT)

    @classmethod
    def from_json(cls, data):
        # Validate data's keys here, and extract only
        # those values that User actually expects
        address = data['address']
        fullName = data['fullName']
        ...
        return User(address, fullName, ...)


newUser = User.from_json(data)

推荐阅读