首页 > 解决方案 > 将一些 JSON 键转换为 Python 对象

问题描述

我有一个 Python 类,如下所示:

class Game:
    """Holds all game related attributes - usually one instance created per game."""

    def __init__(
        self,
        game_id,
        game_type,
        date_time,
        game_state,
        venue,
        home,
        away,
        preferred,
        live_feed,
        season,
    ):

        self.game_id = game_id
        self.game_type = game_type
        self.date_time = date_time
        self.game_state = game_state
        self.venue = venue
        self._live_feed = live_feed
        self.home_team = home
        self.away_team = away
        self.season = season

目前,我通过从 API 响应解析 JSON 并挑选一些值并将它们传递给此类的init()函数来创建此类的实例。

将 API 响应传递给init()函数并从类中的 JSON 字典中解析/挑选这些属性以设置类级属性是否更好(所以围绕这个类的所有逻辑都在一个地方)?

例如,我在main()函数中获取这些值,然后将它们传递给类。

# Create a Game Object
    gameobj_game_id = game_info["gamePk"]
    gameobj_game_season = game_info["season"]
    gameobj_game_type = game_info["gameType"]
    gameobj_date_time = game_info["gameDate"]
    gameobj_game_state = game_info["status"]["abstractGameState"]

game_obj = Game(gameobj_game_id, gameobj_game_type, gameobj_date_time, gameobj_game_state...)

但是该代码是从对象创建逻辑中抽象出来的。

任何建议将不胜感激!

标签: pythonjson

解决方案


您可能想要定义一个类方法,其工作是从此类响应中额外添加“正确”字段。

class Game:
    """Holds all game related attributes - usually one instance created per game."""

    def __init__(
        self,
        game_id,
        game_type,
        date_time,
        game_state,
        venue,
        home,
        away,
        preferred,
        live_feed,
        season,
    ):

        self.game_id = game_id
        self.game_type = game_type
        self.date_time = date_time
        self.game_state = game_state
        self.venue = venue
        self._live_feed = live_feed
        self.home_team = home
        self.away_team = away
        self.season = season

    @classmethod
    def from_json(cls, resp):
        return Game(
            game_id=resp["gamePk"],
            game_type=resp["gameType"],
            ...
        )

类型本身是提供创建对象的规范方式的“方法”(Game(...)间接等同于Game.__new__(...)),不知道每一位信息的来源。其他类方法充当相同数据的各种来源的包装器。


推荐阅读