编写一个类是从 graphql API 响应返回的 JSON 对象创建变量集合的好方法吗?
Posted
技术标签:
【中文标题】编写一个类是从 graphql API 响应返回的 JSON 对象创建变量集合的好方法吗?【英文标题】:Would writing a class be a good way to create a collection of variables from a JSON object returned by a graphql API response? 【发布时间】:2021-03-25 20:36:33 【问题描述】:我正在尝试从 graphql API 响应生成的 JSON 对象中提取一些数据。我的想法是为“父”对象编写一个python类,然后将每条需要的数据建立为一个属性。
例如,如果我要获取 JSON 对象:
'order_id': 'A1234567',
'quantity': 4,
'price': 100.99
'carrier': 'USPS'
'tracking_id': 'ABC987654321',
'fulfillment_status': 'FULFILLED'
我会在类中将每个值分配为self.order_id
、self.quantity
等。我想以这种方式处理它,因为一些 json 响应是深度嵌套的,而且它似乎是一种更简洁的方式来访问和使用数据,而不是使用字典方法。
我想我也可以为每个数据创建变量,但 JSON 对象几乎总是一个订单列表,我的想法是制作一个类的实例化列表,然后循环遍历它们以“做一些事情” " 与每个实例。
我遇到的问题是,在某些情况下,API 不会为某些键返回值,因此我无法将其分配给属性。我以为我可以为类中的每个属性编写try
/except
子句,如果没有值则分配 None ,但这似乎很疯狂(可能/需要为每个属性分配大约 20 个潜在属性实例)。
然后我将在程序中添加一些逻辑,只为'fulfillment_status': 'Fulfilled'
执行某些操作,例如,'fulfillment_status': 'UNFULFILLED'
不会发生这些操作,或者执行某些(或忽略)具有 @ 的类的实例987654329@ 作为某些属性的值。
我是不是想错了?感觉就是这样。
【问题讨论】:
可以定义一个类,它是一个字典,其属性与其内容相对应——两全其美。见How to access items of dictionary as attributes and vice versa。 【参考方案1】:dataclass 可以为你工作(它支持默认值)
from dataclasses import dataclass
data =
'order_id': 'A1234567',
'quantity': 4,
'price': 100.99,
'carrier': 'USPS',
'tracking_id': 'ABC987654321',
'fulfillment_status': 'FULFILLED'
@dataclass
class OrderDetails:
order_id: str
quantity: int
price: float
carrier: str
tracking_id: str
fulfillment_status: str
order_details = OrderDetails(**data)
print(order_details)
输出
OrderDetails(order_id='A1234567', quantity=4, price=100.99, carrier='USPS', tracking_id='ABC987654321', fulfillment_status='FULFILLED')
【讨论】:
【参考方案2】:对我来说,这似乎是一个可靠的想法,我绝对鼓励使用类而不是原始 JSON 数据或普通字典。您可以使用 self.attribute = json_obj.get('attribute', 'default')
方法从 JSON 对象中获取值。这样,如果该属性不存在或为空,您可以声明一个默认值,以便与您处理数据的任何逻辑相匹配。它也不需要任何 try/except 块来实现。
【讨论】:
以上是关于编写一个类是从 graphql API 响应返回的 JSON 对象创建变量集合的好方法吗?的主要内容,如果未能解决你的问题,请参考以下文章