Python 如何让 json.loads() 容忍尾随逗号(非严格 JSON)

json.loads()解析含尾随逗号的字符串会报JSONDecodeError;可用ast.literal_eval()、正则预处理、json5或demjson3库解决。

如果您使用 Python 的 json.loads() 解析包含尾随逗号的字符串(如 {"a": 1,}),会触发 JSONDecodeError,因为标准 JSON 规范不允许尾随逗号。以下是多种绕过该限制的方法:

一、使用 ast.literal_eval() 替代

当输入字符串格式接近 Python 字面量(如字典、列表)且仅含尾随逗号等轻微非 JSON 语法时,ast.literal_eval() 可安全解析,它支持 Python 语法而非严格 JSON。

1、导入 ast 模块:import ast

2、调用 ast.literal_eval() 并传入字符串:ast.literal_eval('{"key": "value",}')

3、确保输入不含不可信代码,因该函数仅限字面量,不执行任意表达式。

二、预处理字符串:移除尾随逗号

通过正则表达式识别并删除对象和数组末尾的逗号,使字符串符合 JSON 标准后再交由 json.loads() 解析。

1、导入 rejson 模块:import re, json

2、定义清理函数,匹配 {... ,}[... ,] 模式并替换为空格或空字符串:cleaned = re.sub(r',\s*([}\]])', r'\1', raw_str)

3、对 cleaned 字符串调用 json.loads(cleaned)

三、使用第三方库 json5

json5 是一个兼容 JSON5 规范的解析器,原生支持尾随逗号、单引号、注释等扩展特性,语义与 JSON 高度一致。

1、安装库:pip install json5

2、导入 json5import json5

3、直接调用 json5.loads() 解析含尾随逗号的字符串:json5.loads('{"x": 1,}')

四、使用 demjson3 库

demjson3 是一个高容错 JSON 解析器,支持宽松模式,能自动修复包括尾随逗号在内的多种常见语法错误。

1、安装库:pip install demjson3

2、导入 demjson3import demjson3

3、调用 demjson3.decode() 并启用宽松模式:demjson3.decode(raw_str, strict=False)