Python解析JSON遇JSONDecodeError,请求协助排查问题
解决JSONDecodeError: Expecting value: line 1 column 1 (char 0)的问题
我来帮你排查这个头疼的JSON解析问题——这个错误提示看起来有点误导人(说第1行有问题),但结合你描述的“前1400行能解析、50万行文件在1400行左右报错”的情况,大概率是文件格式或者解析方式的问题,下面分几种情况给你解决方案:
1. 最可能的原因:你的文件是JSON Lines格式,而非单个JSON数组
你给出的JSON片段是一个独立的对象,而如果你的50万行文件是每行一个独立JSON对象(也就是JSON Lines格式,常见于日志或批量导出的数据),那用json.load(f)一次性加载整个文件就会报错——因为json.load要求整个文件是一个完整的JSON结构(要么是单个对象,要么是用[]包裹的数组),而多个独立对象直接堆叠是不合法的JSON。
你之前只解析前1400行能成功,可能是你误将前1400行整理成了合法的数组,或者刚好前1400行是一个完整的单个JSON对象?不管怎样,改成逐行解析的方式就能解决这个问题,代码如下:
import json file_list = ['filename.txt'] # insert filename(s) here for filename in file_list: # 指定编码避免乱码问题,utf-8-sig可处理带BOM的文件 with open(filename, 'r', encoding='utf-8-sig') as f: # 遍历每一行,同时记录行号方便定位错误 for line_num, line in enumerate(f, 1): stripped_line = line.strip() if not stripped_line: continue # 跳过空行 try: distro = json.loads(stripped_line) # 输出你需要的字段 print( distro['name'], distro['positionTS'], distro['smoothedPosition'][0], distro['smoothedPosition'][1], distro['smoothedPosition'][2] ) except json.JSONDecodeError as e: # 捕获错误并打印行号和内容,方便排查 print(f"⚠️ 第 {line_num} 行解析失败: {e}") print(f"该行内容: {stripped_line[:100]}...") # 只打印前100字符避免刷屏 # 如果想遇到错误就停止,取消下面的注释 # break
2. 检查文件编码或隐藏字符
有时候文件会带有不可见的控制字符(比如UTF-8 BOM、奇怪的换行符),导致解析器无法识别开头的内容,从而抛出“第1列无值”的错误。你可以:
- 打开文件时指定
encoding='utf-8-sig'(如上面代码所示),自动处理BOM; - 用文本编辑器(比如VS Code)打开文件,开启“显示所有字符”(VS Code:
视图 > 切换渲染空白字符),查看1400行左右是否有奇怪的字符(比如\r、不可见的控制码)。
3. 验证1400行附近的JSON格式
如果逐行解析还是在1400行报错,那大概率是该行的JSON语法有问题。你可以:
- 把1400行附近的内容复制出来,保存成一个小文件;
- 用Python自带的JSON校验工具验证:
python -m json.tool < 你的小文件.json,如果有语法错误,工具会直接提示位置; - 检查是否有引号不匹配、逗号缺失、括号未闭合等问题(比如字符串里的引号没有转义,或者数组最后一个元素后面多了逗号)。
关于数据类型差异的疑问
你提到的叉车/固定设备数据结构一致的问题,一般不会导致JSONDecodeError——只要结构是合法JSON,解析器不会因为内容含义不同报错,只会在你访问不存在的字段时抛出KeyError,所以这个应该不是当前问题的原因。
内容的提问来源于stack exchange,提问作者exmatelote
相关产品推荐
相关产品推荐

