Python读取JSON文件触发JSONDecodeError的解决方法咨询
解决JSONDecodeError:处理缺失值的无效JSON文件
遇到这种JSON语法错误太常见了——你的文件里"latitude": ,和"longitude": }明显不符合JSON规范,因为JSON要求每个键必须对应一个合法值(字符串、数字、null等),而这两个字段直接空着了,难怪json.load会报错。
根据你提到的源API中这两个字段是double类型(非空字符串也非None),我们可以通过预处理文件内容修复语法错误的方式来解决,具体步骤如下:
方案1:精准修复指定字段的缺失值
因为你已经明确知道是latitude和longitude字段缺失值,我们可以读取文件后用正则表达式替换掉这些错误的语法,补上合法的double类型默认值(比如0.0,你可以根据业务逻辑调整成合理的默认值):
import json import re # 你的文件路径 file_path = r"C:\Users\dverma25\menus-folder\menus-folder-MA\rt.json" # 第一步:读取原始文件内容 with open(file_path, 'r', encoding="utf8") as f: raw_content = f.read() # 第二步:修复缺失的latitude和longitude值 # 替换"latitude": , 为 "latitude": 0.0, fixed_content = re.sub(r'"latitude":\s*,', '"latitude": 0.0,', raw_content) # 替换"longitude": } 为 "longitude": 0.0} fixed_content = re.sub(r'"longitude":\s*}', '"longitude": 0.0}', fixed_content) # 第三步:加载修复后的JSON数据 try: json_data = json.loads(fixed_content) print("JSON加载成功!") print(json_data) except json.JSONDecodeError as e: print(f"修复后仍存在语法错误: {str(e)}")
方案2:通用修复(如果有更多缺失值字段)
如果未来可能出现其他字段也有类似缺失值的情况,可以用更通用的正则匹配所有键后直接跟逗号/右大括号的情况,替换为默认double值:
# 通用替换:匹配任何键后没有值直接跟,或}的情况 fixed_content = re.sub(r'(\s*"[^"]+":)\s*(,|})', r'\1 0.0\2', raw_content)
⚠️ 注意:这种通用方式可能会误替换一些合法的特殊情况,所以如果只有特定字段出问题,优先用方案1更安全。
保存修复后的文件(可选)
如果你需要把修复后的JSON保存回文件,避免下次再出现同样问题,可以用json.dump指定格式参数,不会产生多余的回车符:
with open(file_path, 'w', encoding="utf8") as f: json.dump(json_data, f, indent=2, ensure_ascii=False)
indent=2会让文件格式整洁,ensure_ascii=False保留UTF-8字符,不会乱码。
这个思路的核心是先把不符合语法的文本修复成合法JSON,再交给json模块解析,完美绕过了原始文件的语法错误问题。
内容的提问来源于stack exchange,提问作者Dhanendra
相关产品推荐
相关产品推荐

