Python处理非JSON响应遇JSONDecodeError,正则修复及装饰器咨询
修复非标准JSON解析问题及装饰器实现方案
一、解决最后一项逗号注入的正则实现
针对你提到的"name":"value"后添加逗号(除非后接})的需求,可以通过正则正向预查实现,同时补充收尾的多余逗号清理逻辑:
import re def fix_non_standard_json(raw_str): # 已实现的规则 fixed = re.sub(r'{', ':{', raw_str) fixed = re.sub(r'}(?!})', '},', fixed) fixed = re.sub(r'(\w+):', r'"\1":', fixed) # 处理键值对后加逗号(排除后接}的情况) # 匹配完整键值对,且后面不是紧跟的}(允许空白字符) fixed = re.sub(r'(".*?":"[^"]*")(?!\s*})', r'\1,', fixed) # 清理多余逗号:比如键值对后直接跟}的情况 fixed = re.sub(r',\s*}', '}', fixed) return fixed
关键说明
(".*?":"[^"]*")(?!\s*}):精准匹配"key":"value"格式的键值对,通过(?!\s*})确保后面没有紧跟的}(兼容中间有空格的场景)。- 最后一步的逗号清理是必要的,避免出现
"key":"value",}这种非法格式。
二、用装饰器封装修复逻辑
可以把JSON修复+解析逻辑封装成装饰器,让所有需要处理这类响应的请求函数复用:
import json import re from functools import wraps def auto_fix_json(func): @wraps(func) def wrapper(*args, **kwargs): raw_response = func(*args, **kwargs) # 执行修复逻辑 fixed = re.sub(r'{', ':{', raw_response) fixed = re.sub(r'}(?!})', '},', fixed) fixed = re.sub(r'(\w+):', r'"\1":', fixed) fixed = re.sub(r'(".*?":"[^"]*")(?!\s*})', r'\1,', fixed) fixed = re.sub(r',\s*}', '}', fixed) # 尝试解析,失败则打印修复内容便于调试 try: return json.loads(fixed) except json.decoder.JSONDecodeError: print(f"修复后仍无法解析的内容:\n{fixed}") raise return wrapper # 使用示例 @auto_fix_json def fetch_server_data(): # 模拟返回非标准JSON的接口响应 return '{ user:"Bob" age:"30" { address:"London" } }' # 调用测试 try: parsed_data = fetch_server_data() print(parsed_data) except Exception as e: print(f"解析失败:{e}")
装饰器的优势是逻辑与业务解耦,所有需要处理这类非标准响应的请求函数,只需添加装饰器即可,无需重复编写修复代码。
三、进阶调试与替代方案
如果正则修复后仍报错,建议:
- 打印修复后的完整字符串,手动检查是否存在未闭合引号、特殊字符未转义等问题。
- 对于复杂的非标准JSON,正则可能覆盖不全,可以直接使用支持宽松语法的第三方库,比如
json5,它原生支持不带引号的键、末尾逗号、注释等非标准格式:
import json5 # 直接解析非标准JSON parsed_data = json5.loads(raw_response)
内容的提问来源于stack exchange,提问作者JavaMan
相关产品推荐
相关产品推荐

