Python json.load()报JSONDecodeError: Extra data错误解决方法
错误成因
报错JSONDecodeError: Extra data的核心原因:
你当前加载的文件是JSON Lines(JSONL)格式,而非标准的单JSON结构文件。这类格式的规则为:每一行独立存储一个合法JSON对象,整个文件没有外层数组包裹,多个独立JSON对象之间靠换行分隔,和你提供的文件样本结构完全一致——第一行是删除类推文的JSON,第二行是另一个删除类推文的JSON,第三行是已发布推文的JSON,三者都是独立的JSON值。
Python内置的json.load()/json.loads()的解析要求为:输入流/字符串必须是一个完整、独立的JSON值(例如单个对象、单个数组)。只要解析完第一个完整JSON对象后,后续还有非空白的剩余内容,就会直接抛出"Extra data"错误。你本次的报错位置在第2行第1列,也就是解析完第一行的删除类JSON后,检测到第二行还有未解析的内容,不符合单JSON的解析规则,因此中断报错。
修复方法
不需要修改原文件结构,逐行读取逐行解析即可,这是处理JSONL格式文件的标准操作:
- 基础加载代码
import json all_records = [] with open('tweets.json', 'r', encoding='utf-8') as f: for line in f: stripped_line = line.strip() # 跳过空行,避免无意义的解析报错 if not stripped_line: continue # 将每一行作为独立JSON对象解析 record = json.loads(stripped_line) all_records.append(record) - 适配提取推文文本目标的优化代码
所有带delete字段的记录是已删除推文的元信息,没有公开的推文文本内容,可直接跳过;仅存在created_at字段的记录是已发布的有效推文,可提取其中的text字段:import json tweet_texts = [] with open('tweets.json', 'r', encoding='utf-8') as f: for line in f: stripped_line = line.strip() if not stripped_line: continue record = json.loads(stripped_line) # 跳过删除类记录 if 'delete' in record: continue # 提取有效推文的文本内容 if 'text' in record: tweet_texts.append(record['text'])
注意事项
- 大体积的推文文件不要尝试修改为外层套数组、对象间加逗号的标准JSON格式,这种操作会占用大量内存,效率远低于逐行解析。
- 如果逐行解析时遇到个别行格式异常(例如原文件中偶发的换行截断了单个JSON内容),可增加try-except块捕获单行解析异常,将相邻的不完整行拼接完成后再执行解析,避免整个流程中断。
- 你提供的样本中出现的跨多行的JSON内容,是粘贴展示时的格式问题,正规渠道导出的Twitter历史JSONL数据,会保证单个JSON对象完整放在同一行内,不会出现行内截断的情况。
内容的提问来源于stack exchange,提问作者JMarcos87
相关产品推荐
相关产品推荐

