Python如何处理非标准JSON
引言
JSON(JavaScript Object Notation)作为轻量级数据交换格式被广泛使用,但实际开发中常遇到不符合标准规范的JSON数据。本文将探讨如何用Python处理这些特殊情况,并提供实用解决方案。
常见非标准JSON类型
- 单引号包裹键值
{ 'name': '张三', 'age': 25 }
- 包含注释
{"version": 1.1 // 版本说明 }
- 尾随逗号
{ "features": ["a", "b", ] }
- 特殊数据类型
{ "timestamp": datetime.datetime.now() }
解决方案对比
方案 | 优点 | 缺点 |
---|---|---|
手动清洗 | 无需额外依赖 | 维护成本高 |
json5库 | 支持现代语法 | 性能较低 |
demjson3 | 兼容性强 | 社区支持较弱 |
正则表达式 | 灵活高效 | 容易出错 |
推荐处理流程
import json
from demjson3 import decodedef process_nonstandard_json(json_str):try:# 尝试标准解析return json.loads(json_str)except json.JSONDecodeError:try:# 使用demjson3解析return decode(json_str)except Exception as e:# 自定义清洗逻辑cleaned = json_str.replace("'", '"').replace("//", "")return json.loads(cleaned)
高级处理技巧
-
类型转换处理
def custom_decoder(obj):if 'datetime' in obj:return datetime.fromisoformat(obj['$datetime'])return obj
-
正则表达式清洗
import re pattern = re.compile(r'//.*$|/\*.*?\*/', re.DOTALL) cleaned = pattern.sub('', json_str)
性能优化建议
- 批量处理时建议使用json5库
- 预处理阶段进行字符串规范化
- 对超大文件采用流式解析
工具推荐
-
在线验证工具
JSONLint 支持非标准格式检测 -
VSCode插件
“JSON Tools” 提供格式化/修复功能
总结
选择方案时应遵循:
- 优先修正数据源
- 生产环境推荐demjson3
- 临时处理使用json5
- 复杂场景结合正则表达式
通过灵活运用多种工具组合,可以有效应对各类非标准JSON处理场景。