当前位置: 首页 > news >正文

Python如何解析非标准JSON:那些坑和解决方案

前言

JSON是Web开发中最常用的数据交换格式,但现实世界从来不按规范来。你可能遇到过这些情况:

  • 单引号代替双引号:{'name': 'Tom'}
  • 末尾多了逗号:{"name": "Tom",}
  • 键名没加引号:{name: "Tom"}
  • 注释混在里面:{"name": "Tom" // this is a comment}

Python自带的json.loads()遇到这些会直接报错。本文整理了几种常见的非标准JSON场景,以及对应的解决方案。


场景一:单引号 + 末尾逗号

这是最常见的"脏数据",通常来自手写配置或某些API的日志。

importjson data="{'name': 'Tom', 'age': 18,}"# 单引号 + 末尾逗号# json.loads(data) # 报错:JSONDecodeError

解决方案1:用ast.literal_eval(推荐)

importast data="{'name': 'Tom', 'age': 18,}"result=ast.literal_eval(data)print(result)# {'name': 'Tom', 'age': 18}

ast.literal_eval可以安全地解析Python字面量,包括单引号字符串、末尾逗号、True/False/None等。

⚠️ 注意:它只能解析Python语法能识别的值,不能处理真正的JSON扩展。

解决方案2:先替换再解析

importjsonimportredeffix_json(s):# 单引号 → 双引号(注意避免替换字符串内部的引号)s=re.sub(r"(?<!\\)'",'"',s)# 去除末尾逗号s=re.sub(r',\s*([\]}])',r'\1',s)returnjson.loads(s)data="{'name': 'Tom', 'age': 18,}"result=fix_json(data)print(result)

这种方式更灵活,但正则替换有边界风险,复杂场景容易漏。


场景二:键名未加引号

data='{name: "Tom", age: 18}'# 键名没引号,不是合法JSON

解决方案:用demjson3

pipinstalldemjson3
importdemjson3 data='{name: "Tom", age: 18}'result=demjson3.decode(data)print(result)# {'name': 'Tom', 'age': 18}

demjson3是目前处理非标准JSON最强的第三方库,支持:

  • 无引号键名
  • 单引号
  • 末尾逗号
  • 注释(///* */
  • JavaScript风格的undefinedNaNInfinity

场景三:包含注释的JSON

某些配置文件会在JSON里加注释,这在标准JSON中是不允许的。

{"name":"Tom",// 用户名"age":18/* 成年了 */}

解决方案:先清注释,再解析

importjsonimportredefstrip_comments(s):# 去除 // 注释s=re.sub(r'//.*','',s)# 去除 /* */ 注释s=re.sub(r'/\*.*?\*/','',s,flags=re.DOTALL)returns raw=''' { "name": "Tom", // 用户名 "age": 18 } '''clean=strip_comments(raw)result=json.loads(clean)print(result)

或者直接用demjson3一步到位:

importdemjson3 result=demjson3.decode(raw)

场景四:JavaScript风格的特殊值

{"value":undefined,"number":NaN,"big":Infinity}

这些在标准JSON中不存在,但在JS生态中很常见。

JS值JSON等价demjson3处理结果
undefinedNone
NaNnan(float)
Infinityinf(float)
true/falsetrue/false正常解析
importdemjson3 data='{value: undefined, num: NaN, big: Infinity}'result=demjson3.decode(data)print(result)# {'value': None, 'num': nan, 'big': inf}

方案对比

方案适用场景优点缺点
json.loads标准JSON快、安全、内置只能处理标准JSON
ast.literal_evalPython风格字典安全、内置不识别null/true/false
demjson3几乎所有非标准情况功能最全性能较慢,依赖第三方
正则替换+json简单单引号/逗号场景轻量容易出错,维护成本高

实践建议

  1. 能用标准JSON就用标准JSON——这是根治问题的方式
  2. 数据来源可信 + 格式简单→ 用ast.literal_eval,性能好且安全
  3. 数据来源杂、格式乱→ 直接上demjson3,别自己造轮子
  4. 生产环境对性能敏感→ 先做数据清洗,再用json.loads

总结

非标准JSON的本质是:数据生产方和消费方对"什么是合法JSON"的定义不一致

Python生态的解决思路也很清晰:

  • 轻量场景 →ast.literal_eval
  • 重度场景 →demjson3
  • 极致场景 → 自己写清洗逻辑

选哪个,取决于你的数据有多"脏"。

http://www.cnnetsun.cn/news/2923189.html

相关文章:

  • OmenSuperHub终极指南:免费解锁惠普暗影精灵笔记本的完整性能控制
  • 3种AMD处理器深度调试方案:释放Ryzen平台隐藏性能潜力
  • LangChain实战:从零构建一个智能问答机器人,解锁大模型应用新姿势
  • 戴森球计划8000+蓝图实战指南:从零构建高效星际工厂的完整方案
  • RS485 HUB选型避坑指南:从8口分线器到带隔离中继器,怎么选才不翻车?
  • 3个实用技巧彻底解决Edge-TTS语音合成连接与配置问题
  • 5个SillyTavern性能优化技巧:让你的LLM前端响应速度提升300%
  • eLabFTW:实验室数字化的终极解决方案,让科研管理变得简单高效
  • 揭秘Steam挂刀行情站:构建24小时实时市场监控系统的技术架构与实践
  • 联发科设备终极解锁指南:用MTKClient掌控你的设备底层
  • 深度解析Android逆向工程:dex2jar实战技巧与架构揭秘
  • Arduino红外遥控终极指南:Arduino-IRremote库完整使用教程
  • Java代码变更如何精准评估影响范围?揭秘JCCI的智能化分析引擎
  • 从绿幕抠像到AI一键抠图:Image Matting技术简史与主流开源项目盘点
  • 【篮球英语】20 季后赛与总决赛:通向冠军之路
  • 大模型 Prompt 优化思路:解决回答不准、逻辑混乱问题
  • RuoYi-Vue-Plus连接池二选一:放弃Druid改用HikariCP前,你需要知道的几个坑(Java 8兼容性、配置项差异)
  • MPC8260 SCC HDLC模式核心原理、配置与实战调试指南
  • MPC8555E CDS嵌入式开发平台:电源、总线与调试架构深度解析
  • LangChain Tool Calling 原理:模型是怎么决定调用哪个工具的?
  • trace.moe技术解析:基于向量数据库的动漫场景搜索引擎架构
  • 深入解析MPC8306 eSDHC控制器:命令响应、状态监控与中断处理实战
  • PDF2Pod:基于分段流水线的文档理解与播客生成系统
  • HSTracker:macOS炉石传说玩家的智能数据助手,5步提升你的对战胜率
  • 终极指南:3步安装Akagi麻将AI,快速提升你的雀魂实战水平
  • 思科重磅预言:量子网络将重塑网络技术未来,经典计算也能即时受益
  • 三步告别电脑噪音:用FanControl打造静音高效的散热系统
  • 3步掌握哔咔漫画下载器:打造个人专属漫画图书馆的完整攻略
  • 如何快速掌握HashCheck:面向新手的Windows文件校验终极指南
  • Realtek RTL8125 2.5GbE网卡驱动架构设计与企业级部署策略