为什么Python中无法对含单引号的JSON字符串执行反序列化操作?
问题根因
你的报错核心是数据库中存储的details字段不符合标准JSON格式要求:
- 标准JSON强制要求属性名、字符串值必须用双引号包裹
- 你当前从数据库取出的
details值为{'sno':[], 'time':[], 'events':[]},所有引号都是单引号,这是Python字典直接转字符串的输出格式,并非合法JSON串,因此json.loads无法解析。
更换数据库前功能正常,是因为旧库的写入逻辑会先调用json.dumps把字典转为标准双引号JSON串再入库,新库的写入逻辑缺失了这一步,直接把Python字典的字符串表示写入了数据库。
解决方案
临时修复方案(快速恢复业务)
使用Python内置ast.literal_eval替代json.loads解析字段,该方法可以安全识别Python格式的字典字符串:
import ast sql.cursorobj.execute("SELECT * FROM timetableevents") for record in sql.cursorobj.fetchall(): print(record) obj= record['btnobject'] # 替换原json.loads行 detailsdict[obj] = ast.literal_eval(record['details'])
永久修复方案(推荐)
修正数据写入逻辑,写入details字段前先将字典转为标准JSON串再入库:
# 写入数据前处理 import json details_json = json.dumps(你的details字典变量) # 再将details_json写入数据库对应字段
修正后新入库的数据即可正常使用json.loads解析,你也可以批量把现有库中存量的单引号格式数据替换为标准JSON格式,彻底消除兼容隐患。
内容的提问来源于stack exchange,提问作者Veeraja Veeraesh
相关产品推荐
相关产品推荐

