Python使用json.loads转字符串报JSONDecodeError的根因与解决方法
问题根本原因
json.loads() 抛出解析错误的核心原因是你传入的str_obj不符合JSON语法规范,属于Python原生字面量格式的字符串,两个核心语法冲突直接导致解析失败:
- JSON规范要求所有字符串必须使用双引号
"包裹,你的字符串中分支名称全部使用单引号'包裹,不满足JSON语法要求 - JSON数据结构仅支持对象(花括号
{}包裹)、数组(方括号[]包裹)、字符串、数字、布尔值、null共6种数据类型,不识别Python特有的元组类型(小括号()包裹的序列)。解析器从字符串第一个字符开始扫描时,无法识别方括号内的元组结构,直接在位置0抛出值识别错误。
有效解决方案
由于字符串是从DevOps环境变量传入,无法提前修改源格式,直接使用Python标准库内置的ast.literal_eval()方法即可安全完成解析,不需要手动做字符串替换。
注意:禁止直接使用
eval()方法解析该字符串,eval()会执行字符串内的任意代码,若环境变量被恶意篡改会触发严重安全漏洞。ast.literal_eval()仅会解析Python原生字面量结构,不会执行任意代码,是生产环境的安全选择。
具体实现代码如下:
import ast import json # 从环境变量获取的原始字符串 str_obj = "[(190229461780583, 'main'), (302030571463836, 'feature/BRANCH_livestream'), (1071064128966159, 'feature/BRANCH_sensitive'), (1137211553786277, 'main'), (1283366887974580, 'feature/add_sql_vm'), (1492751472739439, 'feature/BRANCH-2977'), (2662272892040840, 'main'), (4078787696930326, 'main')]" # 第一步:将Python字面量格式的字符串解析为原生Python对象(列表嵌套元组) python_data = ast.literal_eval(str_obj) # 第二步:若后续逻辑需要标准JSON对象,可先序列化为合法JSON字符串再反序列化 # 元组在JSON序列化时会自动转换为标准数组结构,完全满足数据提取要求 json_obj = json.loads(json.dumps(python_data))
如果你的后续数据提取逻辑不强制要求严格JSON类型,第一步得到的python_data已经可以直接遍历、取值使用,不需要做第二次JSON转换,性能更好。
内容的提问来源于stack exchange,提问作者E. Erfan
相关产品推荐
相关产品推荐

