【问题标题】:Best way to programatically assign class attributes from JSON从 JSON 以编程方式分配类属性的最佳方法
【发布时间】:2020-09-25 03:43:36
【问题描述】:

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

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"]
    ...
)

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

【问题讨论】:

    标签: python json sqlite sqlalchemy


    【解决方案1】:

    这与 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      相关资源
      最近更新 更多