Python调用COWIN API报JSONDecodeError修复及无限循环实现咨询
问题解答
1. 报错类型与含义
你遇到的确实是json.decoder类抛出的错误,具体是JSONDecodeError("Extra data", s, end),含义是JSON解码器在解析完一个合法的JSON对象后,发现文件中还有多余的未解析数据,不符合单JSON文件的语法规范。
2. 报错原因
问题出在冗余IO逻辑上:
- 打开存储JSON的文件时你用了追加模式
'a',如果目标文件之前已经存在内容,新序列化的JSON字符串会追加到原有内容之后,导致文件里存在多个顶层JSON值 - 更关键的是:你本来就已经有现成的Python字典对象
available_centers,完全没必要序列化写文件再反序列化读回来,这个多余的操作直接导致了报错
3. 修复方案
最优方案(推荐):删除冗余的文件读写逻辑,直接使用内存中的字典对象
修改后的vaccine_check函数如下:
def vaccine_check(): # 每次调用更新时间,不要用全局的固定时间 current_time = datetime.datetime.now() try: available_centers = cowin.get_availability_by_district(district_id) # 若需要保留写日志文件的需求,可保留这段写文件逻辑 json_output = json.dumps(available_centers, indent=4) # 把追加模式'a'改成覆盖模式'w',避免文件内多JSON冲突 f = open(f'tests/vaccinecheck[{current_time.strftime("%b %d %Y %H|%M")}].json', 'w') f.write(json_output) f.close() # 直接遍历centers列表,不要硬取100个下标 for center in available_centers["centers"]: session = center["sessions"][0] if session["min_age_limit"] == 45: continue print(f'[{current_time.strftime("%b %d %Y %H:%M")}]', center["name"], '-- vaccines:', session['available_capacity'], '-- age-limit:', session["min_age_limit"]) if session["available_capacity"] >= 1: twilio_send() # 可根据需求调整异常捕获范围 except Exception as e: print(f"运行异常: {str(e)}")
临时修复方案(不删读写逻辑)
如果一定要保留写了再读的逻辑,只要把打开文件的模式从'a'改成'w'覆盖写入即可,保证每次文件内只有一个合法JSON。
4. 无限循环执行方法
在脚本末尾调用vaccine_check的位置改成死循环,每次执行完间隔一段时间再调用(COWIN公开API有调用频率限制,建议间隔10~15分钟,避免被封禁):
if __name__ == "__main__": import time while True: vaccine_check() # 每次查询间隔900秒=15分钟,可自行调整 time.sleep(900)
内容的提问来源于stack exchange,提问作者bigman1234
相关产品推荐
相关产品推荐

