编写一个类是从 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_idself.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 对象创建变量集合的好方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

从 json api 响应生成 Graphql 模式

graphql-java 中的模拟 api 响应

如何在graphql中返回post请求的响应

GraphQL 响应类型/片段之争

WEB API

android graphQL 阿波罗