开发JSON投票系统时遭遇JSONDecodeError错误求助
问题分析与解决方法
错误原因
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 本质是要读取的JSON文件为空或者格式无效,你的代码存在两个核心问题导致该错误:
- 首次运行时,若
poll.json不存在或为空文件,json.load(f)因无有效JSON内容触发解析错误 - 第二个代码块用
"w"模式打开文件时,该模式会直接清空文件内容,后续调用json.load(fe)读取空文件必然报错
修复后的代码
import json def poll(): # 处理文件不存在/为空的情况,初始化投票数据 try: with open("poll.json", "r") as f: poll_data = json.load(f) except (FileNotFoundError, json.JSONDecodeError): # 自定义初始投票选项,可按需修改 poll_data = {"Python": 0, "Java": 0, "C++": 0} with open("poll.json", "w") as f: json.dump(poll_data, f) # 展示投票选项并获取用户输入 print("What would you like to vote?") for option in poll_data.keys(): print(f"- {option}") user_input = input("Please write: ") if user_input not in poll_data: print("Key not found.") return False # 修改投票数据并写入文件 poll_data[user_input] += 1 with open("poll.json", "w") as f: json.dump(poll_data, f, indent=4) # 格式化JSON,提升可读性 print("Voted!") return True poll()
关键修改点
- 异常处理机制:捕获文件不存在、JSON解析失败的异常,自动初始化投票数据并写入文件
- 优化读写逻辑:先将数据读取到内存,修改完成后再一次性写入文件,避免写入模式清空文件后读取的错误
- 友好的选项展示:将投票选项逐行打印,替代原有的直接打印
keys()对象的生硬输出 - 格式化JSON输出:添加
indent=4参数,让生成的JSON文件结构更清晰
内容的提问来源于stack exchange,提问作者Beedful
相关产品推荐
相关产品推荐

