Python处理ndJSON替换键名适配API请求的更优雅实现咨询
优化实现方案
原有实现通过JSON序列化后字符串替换修改键名,既会产生额外的序列化/反序列化开销,还存在误替换字段值的风险,手动维护ID列表索引计数器的写法也较为冗余。以下是更符合Python习惯的实现:
import ndjson import requests # 统一维护字段映射关系,后续修改只需调整该字典 FIELD_MAPPING = { "ADDRESS_CITY": "city", "ADDRESS_LINE_1": "street", "ADDRESS_STATE": "state", "ADDRESS_ZIP": "zipcode" } def process_addresses(addresses_raw, url): # 加载ndjson数据 addresses = ndjson.loads(addresses_raw) # 一步完成ID提取、请求体构造 ids, req_data = zip(*[ ( addr.pop("ID"), { **{new_k: addr[old_k] for old_k, new_k in FIELD_MAPPING.items()}, "candidates": 1, # 此处可根据业务需求调整addressee的拆分逻辑,示例为拆分地址行取空格后内容 "addressee": addr["ADDRESS_LINE_1"].split(maxsplit=1)[-1] } ) for addr in addresses ]) # 发起请求 resp = requests.post(url, json=list(req_data)) resp.raise_for_status() # 可选:增加异常捕获,请求失败时直接抛出异常 resp_data = resp.json() # 批量回填ID for idx, item in enumerate(resp_data): item["ID"] = ids[idx] return resp_data
优化点说明
- 用字典统一维护字段映射规则,无需硬写多个replace,后续维护成本更低
- 直接操作字典构造请求体,省去了两次JSON序列化/反序列化的开销,处理1万条数据的效率提升明显
- 通过列表推导式+zip解包一步完成ID提取和请求体构造,
pop方法直接取出ID同时删除原字段,无需单独循环处理 - 用
enumerate内置函数遍历响应回填ID,不需要手动维护索引计数器,代码更简洁易读
内容的提问来源于stack exchange,提问作者0004
相关产品推荐
相关产品推荐

