Python调用json模块解析JSON报错时如何获取错误字符位置
获取JSON解析错误位置的实现方法
Python内置json模块抛出的JSONDecodeError异常本身就内置了错误位置属性,不需要自行解析错误字符串,也不存在内置的json.get_error()方法,直接捕获异常读取属性即可:
import json try: json.loads(my_json) except json.JSONDecodeError as e: error_loc = e.pos # 直接获取报错的字符偏移量,就是你需要的233450这类数值 error_line = e.lineno # 同步可获取报错对应的行号 error_col = e.colno # 同步可获取报错对应的列号
如果确实需要从错误提示文本中提取位置,异常对象的msg属性就是完整的错误描述字符串,可以自行用正则匹配char (\d+)片段拿到对应数值,不过这种方式稳定性差,不推荐使用——不同Python版本的错误提示文案可能调整,而pos/lineno/colno是稳定的公开属性。
针对脏JSON解析场景的实用技巧
- 拿到错误位置后,可以直接切片取出报错点前后的上下文快速排查问题,比如执行
print(repr(my_json[max(0, error_loc-30):error_loc+30]))就能看到报错位置前后30个字符的内容,不需要在超长文本里手动翻找位置。 - 对于爬取得到的、存在大量未转义引号、尾逗号、多余括号这类问题的非标准JSON,不建议纯靠正则修复,容错解析库的适配效率更高:比如
json5支持大部分非标准JSON语法,demjson3的容错模式可以自动修复大量常见格式错误,比手写正则的覆盖率高很多,也不容易出现误替换正常符号的问题。
内容的提问来源于stack exchange,提问作者eva bacas
相关产品推荐
相关产品推荐

