You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 17:45:03