多API调用结果合并为单个JSON对象及TypeError问题排查
解决API多请求结果合并及TypeError问题
首先,咱们先搞清楚你遇到的TypeError原因:response_list是一个Python列表,列表只能用整数索引(比如response_list[0]取第一个元素)或者切片,你用字符串"meta"去索引肯定会报错。每个API返回的JSON对象是存在列表的每个元素里的,所以要访问meta得遍历列表里的每个字典元素才行。
接下来,咱们说说如何把多个请求的JSON结果合并成一个完整的JSON对象。假设你的每个API响应结构是这样的(从你给出的示例来看):
{ "meta": {"cost": 1, "dailyQuota": 50, "start": "...", "end": "...", ...}, "data": [/*10天的气象数据条目*/] }
我们的目标是把所有响应里的data合并成一个大列表,同时把meta信息做汇总(比如总请求成本、总请求次数,以及整体的时间范围)。下面是修正后的完整代码:
import requests import pyarrow as arrow import json response_list = [] # 注意:这里假设dates是你已经定义好的起始日期列表 for date in dates: start = arrow.get(date) # 把arrow日期对象转成API能识别的字符串格式 start_str = start.format('YYYY-MM-DD HH:mm') end_str = start.shift(days=10).format('YYYY-MM-DD HH:mm') response = requests.get( 'https://your-api-url', # 替换成你的实际API地址 params={ 'foo': 'bar', # 修正语法:键值对要用引号,且逗号分隔 'start': start_str, 'end': end_str }, headers={ 'Authorization': api_key } ) # 建议加个状态码检查,避免无效数据加入列表 if response.status_code == 200: response_list.append(response.json()) else: print(f"请求失败,日期:{date},状态码:{response.status_code}") # 开始合并结果 merged_json = { "meta": {}, "data": [] } # 1. 合并所有气象数据 for res in response_list: # 用extend把每个响应的data列表合并到总列表里 merged_json["data"].extend(res.get("data", [])) # 2. 汇总元数据(根据你的需求调整) if response_list: # 取第一个响应的基础元数据(比如lat、lng、dailyQuota这些不变的字段) base_meta = response_list[0]["meta"].copy() # 计算汇总值:总花费、总请求次数 total_cost = sum(res["meta"]["cost"] for res in response_list) total_requests = sum(res["meta"]["requestCount"] for res in response_list) # 确定整体的时间范围:最早的start和最晚的end overall_start = min(res["meta"]["start"] for res in response_list) overall_end = max(res["meta"]["end"] for res in response_list) # 更新合并后的元数据 merged_json["meta"] = { **base_meta, "totalCost": total_cost, "totalRequestCount": total_requests, "overallStart": overall_start, "overallEnd": overall_end } # 现在可以正常访问合并后的meta了 print(merged_json["meta"]) # 保存为单个JSON文件 with open("merged_weather_data.json", "w") as f: json.dump(merged_json, f, indent=2)
关键细节说明:
- 修正了你原代码里的语法错误:
params里的键值对需要用引号,且参数之间要有逗号分隔;同时把Arrow日期对象转换成字符串格式,确保API能正确解析。 - 加入了请求状态码检查,避免把失败的响应数据加入列表。
- 合并
data时用extend而不是append,这样不会把每个响应的data列表当成单个元素加入,而是把所有条目平铺到总列表里。 - 元数据汇总部分保留了不变的字段(比如经纬度),同时添加了汇总统计项,你可以根据自己的需求调整这部分逻辑。
内容的提问来源于stack exchange,提问作者Dan0z_Direct
相关产品推荐
相关产品推荐

