gpt4 book ai didi

python - 从 REST API 返回的 JSON 动态创建 Python 对象

转载 作者:行者123 更新时间:2023-12-01 09:30:51 25 4
gpt4 key购买 nike

假设我有两个 REST API 端点(http://example.com/taskhttp://example.com/employee)和以下两个类:

class Employee(object):
def __init__(self, **kwargs):
self.ID = kwargs['ID']
self.first_name = kwargs['first_name'] if 'first_name' in kwargs else None
self.last_name = kwargs['last_name'] if 'last_name' in kwargs else None

class Task(object):
def __init__(self, **kwargs):
self.ID = kwargs['ID']
self.start_date = kwargs['start_date']
self.employee = Employee(ID=kwargs['employee_id'])

我现在想从 REST API 返回的 json 创建 Python 对象。

假设对 http://example.com/task/19 的 GET 返回以下 json:

json_data =  {'ID': '19', 'start_date': '2018-04-23', 'employee_id': 'xyz1223'}
task = Task(**json_data)

现在,以下所有工作

print(task.ID) # 19
print(task.start_date) # 2018-04-23
print(task.employee.ID) # xyz1223

但是print(task.employee.first_name)返回None。我希望发生的是,在后台向 http://example.com/employee/xyz1223 发送 GET 请求,解析生成的 json,并且属性 填写了first_namelast_name

最Python化的方法是什么?

最佳答案

我会让__init__方法尽可能简单和愚蠢,这意味着没有 I/O。这项工作被推迟到名为 from_api 的类方法,该方法仅将请求的 ID 作为参数,然后构建适当的 URI,解析输出,并将必要的数据传递给对 __init__ 的调用。

Employee.from_api 仍然非常简单,但是 Task.from_api 是您通过调用 Employee.from_api 来实现“连接”的地方从解析的任务 JSON 数据中获取的参数。

class Employee(object):
BASE_URL = "http://example.com/employee/"

def __init__(self, id_, first, last):
self.id_ = id_
self.first_name = first
self.last_name = last

@classmethod
def from_api(cls, id_):
url = cls.BASE_URL + id_
json_data = requests.get(url).json()
return Employee(id_=id_
first=json_data.get('first_name'),
last=json_data.get('last_name'))


class Task(object):
BASE_URL = "http://example.com/task/"

def __init__(self, id_, start_date, emp):
self.ID = id_
self.start_date = start_date
self.employee = emp

@classmethod
def from_api(cls, id_):
url = cls.BASE_URL + id_
json_data = requests.get(url).json()
emp = Employee.from_api(json_data['employee_id'])
return Task(id_, json_data['start_date'], emp)


task = Task.from_api("19")
<小时/>

这样的设计非常适合Python 3.7即将推出的data classes

@dataclass
class Employee:
id_: str
first_name: str
last_name: str

BASE_URL: ClassVar[str] = "http://example.com/employee/"


@classmethod
def from_api(self, id_):
# same as above


@dataclass
class Task:
id_: str
start_data: str # Or maybe datetime.date, depending on your design
employee: Employee

BASE_URL: ClassVar[str] = "http://example.com/task/"

@classmethod
def from_api(self, id_):
# same as above

关于python - 从 REST API 返回的 JSON 动态创建 Python 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49982399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com