我正在尝试从graphql API响应生成的JSON对象中提取一些数据。我的想法是为";"父";对象,然后将每一条所需的数据建立为一个属性。
例如,如果我要获得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'
不会执行的操作,并对以None
为某些属性值的类执行某些操作(或忽略(。
我是不是想错了?感觉很像。
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')
对我来说,这似乎是一个可靠的想法,我绝对鼓励使用类而不是原始JSON数据或普通字典。您可以使用self.attribute = json_obj.get('attribute', 'default')
方法从JSON对象中获取值。这样,如果属性不存在或为null,则可以声明一个默认值,以便与处理数据的任何逻辑配合良好。它也不需要任何try/except块来实现。