You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python动态处理不同结构的JSON文件批量添加键值对?

问题

我有两种结构不同的JSON文件:

  1. 第一种是对象结构,业务数据存储在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]}}]}
  1. 第二种本身就是对象数组,业务数据直接存储在根数组中,示例:
[{"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 01:20:40