Python新手使用json.loads/json.load时遭遇解析错误求助
作为刚接触Python和开发的新手,你遇到的这三个JSON相关错误其实都是很典型的「混淆了Python对象和JSON格式」的问题,咱们一个个理清楚:
错误1:将candidateList转为字符串后用json.loads解析报错
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
原因
你应该是直接用了str(candidateList)把Python字典转成字符串,但这个字符串是Python字典的字符串表示,不是标准JSON格式:
- Python字典用单引号
'包裹键值,而JSON要求必须用双引号" - 两者在布尔值、
None等写法上也有差异
解决办法
要用json.dumps()把Python字典转换成标准JSON字符串,再用json.loads()解析:
# 把字典转成标准JSON字符串 json_str = json.dumps(candidateList, indent=4) # 解析JSON字符串为Python字典 parsed_dict = json.loads(json_str)
错误2:尝试json.loads("candidateList")报错
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
原因
json.loads()的参数必须是合法的JSON格式字符串,而你传入的是字符串"candidateList"——这只是变量名的文本,根本不是JSON内容,解析器自然找不到合法的JSON值。
解决办法
要传入的是json.dumps()生成的JSON字符串,而不是变量名的字符串,参考上面的正确写法。
错误3:改用json.load加载字典报错
AttributeError: 'dict' object has no attribute 'read'
原因
json.load()的作用是从文件对象(或具备read()方法的类文件对象)中读取JSON内容,它接收的是文件对象,不是Python字典。你直接传字典的话,字典没有read()方法,所以报错。
解决办法
如果是要把字典写入文件再读取,用json.dump()(写文件)和json.load()(读文件)配合:
# 把字典写入JSON文件 with open('candidates.json', 'w') as f: json.dump(candidateList, f, indent=4) # 从文件读取JSON内容为字典 with open('candidates.json', 'r') as f: loaded_dict = json.load(f)
如果只是在内存中转换字典和JSON字符串,用json.dumps()和json.loads()就足够了,不需要json.load()。
完整的正确流程示例
# 生成候选人数据字典 candidateList = calCan() # 内存中转换:字典 ↔ JSON字符串 json_string = json.dumps(candidateList, indent=4) print("生成的JSON字符串:") print(json_string) # 解析JSON字符串回到字典 parsed_data = json.loads(json_string) print("\n解析后的Python字典:") print(parsed_data) # 持久化到文件并读取 with open('candidates_data.json', 'w') as outfile: json.dump(candidateList, outfile, indent=4) with open('candidates_data.json', 'r') as infile: loaded_data = json.load(infile) print("\n从文件加载的数据:") print(loaded_data)
小补充
你生成的datetime.time对象转成字符串存储是没问题的,但之后如果要把解析后的字符串转回datetime.time对象,需要自己做字符串解析,比如:
from datetime import datetime # 假设解析后的时间字符串是"09:32:00" time_str = "09:32:00" time_obj = datetime.strptime(time_str, "%H:%M:%S").time()
内容的提问来源于stack exchange,提问作者Gordon Rose

