JSONDecodeError异常排查:多嵌套字典的JSON读写方案
问题解决:JSON加载报错与嵌套字典正确写入方案
错误原因分析
JSONDecodeError: Extra data 通常是因为目标JSON文件中包含多个独立的JSON对象,或者存在多余的不可见字符/无效空白内容。你提到复制内容后加载正常,大概率是原文件里有肉眼无法识别的多余字符,或是写入时意外多次写入了JSON数据导致的。
正确的嵌套字典JSON写入方式
确保每次写入单个完整的JSON对象,采用以下标准写法即可避免问题:
- 用
with语句自动管理文件句柄,防止缓冲区未刷新引发的写入异常 - 使用
w模式(覆盖写入),不要用a模式(追加),避免多次写入产生多个JSON对象 - 可选
indent参数格式化输出,仅提升可读性,不影响JSON合法性
示例代码:
import json data = { 'meta_data': {'id': 0, 'start': 1238397024.0, 'end': 1238397056.0, 'best': []}, 'real_data': { 'YAS': { 't1': [1238397047.2182617], 'v1': [5.0438767766574255], 'v2': [4.371670270544587] } } } # 标准写入流程 with open('target_file.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4)
出错文件的临时读取方案
针对已经报错的文件,可以通过以下方法修复读取:
方案1:清理内容后加载
读取文件内容,去除前后多余空白和不可见字符,再用json.loads()解析:
import json file_path = 'error_file.json' with open(file_path, 'r', encoding='utf-8') as f: content = f.read().strip() # 移除前后空白(含换行、制表符等) try: data = json.loads(content) except json.JSONDecodeError: # 极端情况:移除非ASCII不可见字符 import re content = re.sub(r'[^\x00-\x7F]+', '', content) data = json.loads(content.strip())
方案2:处理多JSON对象场景
如果文件确实因重复写入存在多个JSON对象,可通过流式方式逐个解析:
import json file_path = 'error_file.json' data_list = [] with open(file_path, 'r', encoding='utf-8') as f: buffer = '' for line in f: line = line.strip() if not line: continue buffer += line # 匹配括号确保拿到完整的JSON对象 if buffer.count('{') == buffer.count('}') and buffer.count('[') == buffer.count(']'): try: data = json.loads(buffer) data_list.append(data) except json.JSONDecodeError: pass buffer = '' # data_list 包含所有解析成功的JSON对象
方案3:手动修复文件
直接用文本编辑器打开报错文件,检查末尾是否有多余空行、重复JSON内容或乱码字符,删除后保存,再用常规json.load()读取即可。
内容的提问来源于stack exchange,提问作者Peedaruos
相关产品推荐
相关产品推荐

