Python加载JSON文件报JSONDecodeError:第1行第1列(位置0)无有效值求助
问题根因说明
从调试输出的文件对象信息可以确认,代码已经顺利定位到目标JSON文件,文件打开逻辑、路径传参、读取模式、默认编码配置都没有问题。抛出的json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)错误,本质是传入JSON解析器的内容从第0个字符开始就不符合JSON语法规范,和文件打开流程无关。
常见触发场景
- 目标JSON文件为完全空文件,无任何可解析内容
- 文件开头带有Windows系统导出的UTF-8 BOM不可见字符,导致解析器识别不到合法的JSON起始标记(
{或[) - 文件开头前置了多余注释、换行、空格等非JSON规范内容
- 文件生成过程中程序中断,仅写入了部分残缺内容,没有形成完整的合法JSON结构
可落地的排查与解决步骤
第一步:先校验文件实际读取到的内容
不要直接把文件对象传给json.load,先读取原始文本内容做校验,定位问题点。替换原有代码逻辑如下:
def getInfoFromJson (dir): with open(dir, 'r', encoding='utf-8') as f: # 先读取全部文件内容 raw_content = f.read() # 打印内容长度与前20个字符的可识别表示,能直观看到不可见字符 print(f"文件总长度:{len(raw_content)},前20个字符:{repr(raw_content[:20])}") # 再对原始内容做JSON解析 data = json.loads(raw_content) objectId = data['id']
注:使用
repr打印字符是关键,能把BOM、换行符等不可见的特殊字符以转义形式展示出来,避免因为内容是空白、不可见字符导致排查盲区。
第二步:根据打印结果针对性解决
- 如果打印的文件总长度为0:说明文件本身是空的,需要检查之前生成该JSON文件的逻辑,确认是否存在写入后没有主动flush、写入流程中断、误传了空占位文件路径的问题
- 如果打印的前20个字符以
'\ufeff'开头:说明文件是带BOM的UTF-8格式,只需要把文件打开时的编码参数换成utf-8-sig,Python会自动识别并剥离开头的BOM头,代码修改为:with open(dir, 'r', encoding='utf-8-sig') as f: - 如果打印的开头是注释、多余空白:直接编辑目标JSON文件,删除开头的非法内容,保证第一个有效字符是
{或[,符合JSON语法规范即可 - 如果打印的内容是残缺的半截JSON结构:说明之前的文件生成流程异常,重新生成完整的合法JSON文件即可
常见认知误区
很多开发者踩过这个坑:觉得文件路径打出来是对的、文件能正常打开,就默认里面存的是合法JSON。实际上Python的open函数根本不关心文件里存的是什么,只要路径对、有权限打开,哪怕里面是空的、是乱码、是半截没写完的内容,都不会在打开阶段报错,所有内容是不是符合JSON格式的检查,全是在json.load解析的时候才会做的。
内容的提问来源于stack exchange,提问作者Süleyman Ali Akpınar
相关产品推荐
相关产品推荐

