多页API JSON数据合并为单对象及JSON序列化报错解决方案咨询
解决思路与修正方案
嘿,这个问题其实是个很典型的小语法疏漏——我一眼就看到问题所在啦!
核心错误原因
你代码里的requests.get(url).json少了一对括号!json是requests响应对象的方法,必须调用它(也就是写成.json())才能得到解析后的JSON数据。你现在往response列表里存的是方法本身(比如<bound method Response.json of <Response [200]>>这类对象),而不是实际的JSON内容,这就导致json.dumps()试图序列化方法对象时,抛出Object of type 'method' is not JSON serializable的错误。
具体解决步骤与修正代码
1. 先修正数据获取的核心问题
把.json改成.json(),同时注意分页范围:你要遍历32页,但range(1,32)只会到第31页(因为Python的range是左闭右开),所以得写成range(1,33)才会覆盖1-32页:
import requests import json response_data = [] # 遍历1到32页 for page in range(1, 33): url = f"https://api.dane.gov.pl/resources/17201/data?page={page}" # 调用.json()方法获取解析后的JSON数据 page_content = requests.get(url).json() response_data.append(page_content)
2. 合并数据为大对象
根据API返回的结构选择合适的合并方式:
- 如果每页返回的是数据列表(比如每页是多条记录的数组),用
extend直接合并元素比append存整个页列表更合理:all_records = [] for page in range(1, 33): url = f"https://api.dane.gov.pl/resources/17201/data?page={page}" page_content = requests.get(url).json() # 直接把每页的记录加入总列表 all_records.extend(page_content) - 如果每页返回的是包含数据字段的字典(比如有
data字段存记录,还有分页信息),就提取对应字段合并:all_records = [] for page in range(1, 33): url = f"https://api.dane.gov.pl/resources/17201/data?page={page}" page_response = requests.get(url).json() # 假设数据存在'data'关键字下 all_records.extend(page_response['data'])
3. 可选优化:让程序更健壮
加入异常处理和请求优化,避免因网络问题或API限流导致程序崩溃:
import requests import json from time import sleep # 使用Session保持连接,提升请求效率 session = requests.Session() all_records = [] for page in range(1, 33): try: url = f"https://api.dane.gov.pl/resources/17201/data?page={page}" response = session.get(url) # 若API返回非200状态码,直接抛出异常 response.raise_for_status() page_content = response.json() all_records.extend(page_content) # 加0.5秒延迟,避免请求过于频繁被限流 sleep(0.5) except requests.exceptions.RequestException as e: print(f"获取第{page}页失败: {str(e)}") continue # 现在可以正常序列化合并后的大对象了 final_json = json.dumps(all_records)
为什么之前的json.loads()/json.dumps()没用?
因为你列表里存的根本不是JSON字符串或可序列化的Python对象,而是方法引用。只有当你用.json()拿到实际的字典/列表后,json.dumps()才能正常工作——它的作用是把Python可序列化对象转成JSON字符串,而不是处理方法这类不可序列化的对象。
内容的提问来源于stack exchange,提问作者Frendom
相关产品推荐
相关产品推荐

