如何用Python动态处理不同结构的JSON文件批量添加键值对?
问题
我有两种结构不同的JSON文件:
- 第一种是对象结构,业务数据存储在
items数组中,示例:
{"first":true,"last":true,"pageSize":10,"page":0,"totalPages":1,"totalItems":10,"items":[{"chargerId":"EX-1193-1A13-1-2149-00024","chargerName":"Lite-on IC80","imsi":null,"location":{"type":"Point","coordinates":[-84.62403006,39.13444449]}},{"chargerId":"0df6d6930f494a2e86f5aa4d5fdf78fc","chargerName":"Solution Lab Rhombus 60kW","imsi":null,"location":{"type":"Point","coordinates":[-84.62248500,39.13479400]}}]}
- 第二种本身就是对象数组,业务数据直接存储在根数组中,示例:
[{"assetId": "2ca0021f841adc4b01841ae581730000","start": "2022-09-23T15:04:34.229Z","end": "2050-01-01T00:00:00.000Z","year": 2022,"oem": "FORD","model": "F-150"},{"assetId": "2ca0075582044cdc0182371cb4da0004","start": "2022-01-04T17:24:39.809Z","end": "2050-01-01T00:00:00.000Z","year": 2022,"oem": "KIA","model": "Niro"}]
需要给两种JSON文件中的每个业务数据元素批量添加MD_BATCH_ID、MD_INGESTION_DATE_TIME、MD_RECORD_NUMBER三个键值对,但无法预知接收的JSON文件结构。现有Python代码仅支持处理包含items键的JSON文件,代码如下:
def process_json_file(json_string,s3_client,bucket_name,key): global index_count index_count = 1 print('Inside Json Reader') json_content = json.loads(json_string) cur_datetime = datetime.now() print(json_content['items']) for i in json_content['items']: i["MD_BATCH_ID"] = '253' i["MD_INGESTION_DATE_TIME"] = cur_datetime i["MD_RECORD_NUMBER"] = index_count index_count = index_count +1 s3_client.put_object(Bucket=bucket_name, Key=key, Body=json.dumps(json_content,indent=4,default=str).encode())
请修改代码,实现动态处理不同结构的JSON文件。
解决方案
修改后的代码可自动识别JSON结构,兼容两种格式:
import json from datetime import datetime def process_json_file(json_string, s3_client, bucket_name, key): index_count = 1 print('Inside Json Reader') json_content = json.loads(json_string) cur_datetime = datetime.now() batch_id = '253' # 判断JSON根结构类型 if isinstance(json_content, list): # 根为数组,直接遍历每个业务元素 for item in json_content: item["MD_BATCH_ID"] = batch_id item["MD_INGESTION_DATE_TIME"] = cur_datetime item["MD_RECORD_NUMBER"] = index_count index_count += 1 elif isinstance(json_content, dict) and 'items' in json_content: # 根为对象且包含items数组,遍历数组内的业务元素 for item in json_content['items']: item["MD_BATCH_ID"] = batch_id item["MD_INGESTION_DATE_TIME"] = cur_datetime item["MD_RECORD_NUMBER"] = index_count index_count += 1 else: # 处理不支持的结构,可根据需求调整逻辑 print(f"Unsupported JSON structure for key: {key}") return # 将修改后的JSON写入S3 s3_client.put_object( Bucket=bucket_name, Key=key, Body=json.dumps(json_content, indent=4, default=str).encode() )
关键改动说明
- 移除全局变量
index_count,改用函数内局部变量,避免并发场景下的计数混乱 - 通过
isinstance判断JSON根结构:- 若为数组,直接遍历每个元素添加元数据
- 若为字典且包含
items键,遍历items数组添加元数据 - 增加不支持结构的判断,避免程序报错
- 提取
batch_id为单独变量,后续修改更便捷 - 保留原有的S3写入逻辑,确保修改后的JSON正确存储
内容的提问来源于stack exchange,提问作者Saksham Srivastava
相关产品推荐
相关产品推荐

