You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python JSON单双引号差异:Flask请求传入单引号JSON报错解决方案

问题根因

JSON 官方规范(RFC 8259)明确规定,对象的键、字符串类型的值必须使用双引号包裹,单引号不属于 JSON 合法语法。Flask 默认的 JSON 解析器严格遵循标准实现,遇到单引号包裹的键/字符串时,会直接判定为非法格式,抛出解析错误,即你收到的「unable to evaluate payload provided」提示。

适配方案

按优先级从高到低排序如下:

  • 调整上游输出逻辑(最优方案)
    如果可以修改输出单引号格式的上游脚本,直接使用标准 JSON 序列化方法生成内容即可。以Python脚本为例,不要直接用str(字典变量)输出内容,换成json.dumps(字典变量),生成的天然是符合标准的双引号包裹JSON格式。
  • Flask端兼容解析(次优,适合无法调整上游的场景)
    在Flask的请求处理逻辑中新增兼容分支,解析失败时用兼容方法处理非标准格式,两种常用安全实现:
    1. 使用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")
        # 业务逻辑省略
    
    1. 使用demjson3兼容库解析
      该库专门支持解析各类非标准JSON格式,包括单引号键、末尾逗号等常见不规范写法:
      安装命令:pip install demjson3
      解析示例:
    import demjson3
    # raw_payload为上游传来的原始字符串
    payload = demjson3.decode(raw_payload)
    
  • 临时字符串替换(仅应急使用,不推荐)
    若两端逻辑都无法调整,可以临时用字符串替换把单引号替换为双引号,该方法风险很高:如果payload的字符串值本身包含单引号(如{'name': "O'Conner"}),替换后会破坏原有数据结构,仅适合确认payload无嵌套引号的场景使用。

内容的提问来源于stack exchange,提问作者L Xandor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:30:04