如何从API返回的JSON中提取OrderItemId对应的value并追加到列表
问题
调用某API获取JSON响应,响应包含items数组,每个item对象的referenceNumbers字段是一个数组,其中每个元素包含type和value属性。我需要将type为OrderItemId对应的value值追加到列表中。当前代码直接通过item['referenceNumbers']['value']取值会报错,求正确实现方向。
API响应示例1
"items": [ { "packagingType": "PCS", "description": "[REDACTED]", "productCode": "MATT", "freightClass": "300", "insuranceValue": 428.70999999971326, "primaryReferenceNumber": null, "poNumber": "[REDACTED]", "skuNumber": "[REDACTED]", "pluNumber": null, "actualQuantity": 1, "actualWeight": 125, "actualWeightUnitOfMeasure": "Pounds", "actualPallets": 1, "actualVolume": null, "actualVolumeUnitOfMeasure": "Cubic Feet", "actualPackagingLength": null, "actualPackagingHeight": null, "actualPackagingWidth": null, "actualPackagingUnitOfMeasure": "Inches", "referenceNumbers": [ { "type": "CustomerItemIdentifier1", "value": "[REDACTED]" }, { "type": "OrderItemId", "value": "123456789" }, { "type": "SHID", "value": "[REDACTED]" } ], "associatedStop": { "pickSequenceNumber": null, "dropSequenceNumber": null } } ]
API响应示例2
"items": [ { "packagingType": "PCS", "description": "[REDACTED]", "productCode": "MISC", "freightClass": "300", "insuranceValue": 2500, "primaryReferenceNumber": null, "poNumber": "[REDACTED]", "skuNumber": "[REDACTED]", "pluNumber": null, "actualQuantity": 1, "actualWeight": 132, "actualWeightUnitOfMeasure": "Pounds", "actualPallets": null, "actualVolume": null, "actualVolumeUnitOfMeasure": "Cubic Feet", "actualPackagingLength": null, "actualPackagingHeight": null, "actualPackagingWidth": null, "actualPackagingUnitOfMeasure": "Inches", "referenceNumbers": [ { "type": "OrderItemId", "value": "987654321" } ], "associatedStop": { "pickSequenceNumber": null, "dropSequenceNumber": null } } ]
现有代码
for object in parsed['results']: if object['event']['eventType'] in event_list: for item in object['event']['items']: orders_event_name.append(object['event']['eventType']) orders_customer_order.append(object['billToReferenceNumber']) orders_reference_number.append(item['referenceNumbers']['value']) orders_event_id.append(None) orders_item_id.append(item['skuNumber']) orders_datetime_started.append(object['eventTime']) orders_seconds.append(None) orders_load_number.append(object['event']['loadNumber'])
解决方案
报错核心原因是item['referenceNumbers']是数组类型,不是单个对象,无法直接通过['value']取值。需要遍历该数组,筛选出type为OrderItemId的元素后再提取value。
基础修改版本
for object in parsed['results']: if object['event']['eventType'] in event_list: for item in object['event']['items']: orders_event_name.append(object['event']['eventType']) orders_customer_order.append(object['billToReferenceNumber']) # 遍历referenceNumbers数组,匹配目标类型 order_item_id = None for ref in item['referenceNumbers']: if ref['type'] == 'OrderItemId': order_item_id = ref['value'] break orders_reference_number.append(order_item_id) orders_event_id.append(None) orders_item_id.append(item['skuNumber']) orders_datetime_started.append(object['eventTime']) orders_seconds.append(None) orders_load_number.append(object['event']['loadNumber'])
简洁优化版本(生成器表达式)
如果业务上能保证每个item必定包含OrderItemId类型的元素,可直接用:
order_item_id = next(ref['value'] for ref in item['referenceNumbers'] if ref['type'] == 'OrderItemId')
如果存在没有OrderItemId的情况,需添加默认值避免报错:
order_item_id = next((ref['value'] for ref in item['referenceNumbers'] if ref['type'] == 'OrderItemId'), None)
将上述代码替换原有orders_reference_number.append(item['referenceNumbers']['value'])这一行即可。
内容的提问来源于stack exchange,提问作者holyshilo111
相关产品推荐
相关产品推荐

