Python JSON单双引号差异:Flask请求传入单引号JSON报错解决方案
问题根因
JSON 官方规范(RFC 8259)明确规定,对象的键、字符串类型的值必须使用双引号包裹,单引号不属于 JSON 合法语法。Flask 默认的 JSON 解析器严格遵循标准实现,遇到单引号包裹的键/字符串时,会直接判定为非法格式,抛出解析错误,即你收到的「unable to evaluate payload provided」提示。
适配方案
按优先级从高到低排序如下:
- 调整上游输出逻辑(最优方案)
如果可以修改输出单引号格式的上游脚本,直接使用标准 JSON 序列化方法生成内容即可。以Python脚本为例,不要直接用str(字典变量)输出内容,换成json.dumps(字典变量),生成的天然是符合标准的双引号包裹JSON格式。 - Flask端兼容解析(次优,适合无法调整上游的场景)
在Flask的请求处理逻辑中新增兼容分支,解析失败时用兼容方法处理非标准格式,两种常用安全实现:- 使用
ast.literal_eval解析
该方法可以安全解析Python风格的字典字符串(支持单引号键格式),不会执行恶意代码,安全性远高于eval。示例代码:
import ast from flask import request, jsonify @app.route('/your_api', methods=['POST']) def api_handler(): # 先尝试标准JSON解析 try: payload = request.get_json() except Exception: # 标准解析失败时走兼容逻辑 raw_payload = request.get_data(as_text=True) try: payload = ast.literal_eval(raw_payload) except Exception: return jsonify({"error": "unable to evaluate payload provided"}), 400 # 后续正常处理payload vec = payload.get("vec") # 业务逻辑省略- 使用
demjson3兼容库解析
该库专门支持解析各类非标准JSON格式,包括单引号键、末尾逗号等常见不规范写法:
安装命令:pip install demjson3
解析示例:
import demjson3 # raw_payload为上游传来的原始字符串 payload = demjson3.decode(raw_payload) - 使用
- 临时字符串替换(仅应急使用,不推荐)
若两端逻辑都无法调整,可以临时用字符串替换把单引号替换为双引号,该方法风险很高:如果payload的字符串值本身包含单引号(如{'name': "O'Conner"}),替换后会破坏原有数据结构,仅适合确认payload无嵌套引号的场景使用。
内容的提问来源于stack exchange,提问作者L Xandor
相关产品推荐
相关产品推荐

