如何在Python3中使用格式不规范的JSON文件
处理不规范类JSON格式的Python解决方案
这种半结构化的"伪JSON"确实挺闹心的——标准json模块对格式要求极其严格,哪怕少个引号或者多个末尾逗号都会直接报错。不过针对你描述的场景(字符串值未加双引号,还可能存在末尾多余逗号),有两种可靠的处理方式:
方案1:用正则预处理修复格式(仅依赖标准库)
既然核心问题是字符串值没有被双引号包裹,我们可以先用正则表达式把这些值补上引号,再交给标准json模块解析。这个方法不用装额外库,适合轻量场景。
代码示例:
import re import json # 读取你的不规范文件 with open("your_funky_json.txt", "r", encoding="utf-8") as f: raw_text = f.read() # 正则规则:匹配冒号后、非数字/非引号开头的内容,直到逗号或大括号结束 # 适配你的场景:只给未加引号的字符串值加双引号 fixed_text = re.sub( r'(?<=: )(?!["\'\d])([^,}]+)', # 匹配目标内容 r'"\1"', # 替换为带双引号的格式 raw_text ) # 处理可能存在的末尾多余逗号(比如你示例里AAA后面的逗号) fixed_text = re.sub(r',\s*([}\]])', r'\1', fixed_text) # 现在可以正常解析了 try: parsed_data = json.loads(fixed_text) print("解析成功!") print(parsed_data["Apparel"]["XX"]) # 测试访问数据 except json.JSONDecodeError as e: print(f"解析失败,错误位置:{e.pos},原因:{e.msg}")
注意点:
- 这个正则假设你的值里没有逗号或大括号,如果有特殊场景(比如值包含逗号),需要调整正则规则;
- 额外加了处理末尾多余逗号的逻辑,因为你示例里最后一个键值对后面有逗号,这也是标准JSON不允许的。
方案2:使用容错第三方解析库(更省心)
如果你的文件还有其他不规范情况(比如单引号、注释、无引号键),用专门的容错解析库会更靠谱。推荐json5——它支持JSON5规范(一种更宽松的JSON超集),完美适配这类不规范格式。
步骤:
- 先安装库:
pip install json5
- 解析代码:
import json5 # 直接读取并解析,无需预处理 with open("your_funky_json.txt", "r", encoding="utf-8") as f: parsed_data = json5.load(f) # 正常使用解析后的数据 print(parsed_data["Apparel"]["TT"]["3"])
优势:
- 自动处理无引号字符串、末尾多余逗号、单引号、注释等多种不规范情况;
- 用法和标准
json模块几乎一致,学习成本低。
内容的提问来源于stack exchange,提问作者YaddyVirus




