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

Flask API接收POST JSON报错:Expected object or value,如何修复?

解决Flask API接收JSON转DataFrame时的"Expected object or value"错误

问题场景

在Flask API中通过POST方法接收JSON并转换为Pandas DataFrame时,出现Expected object or value错误。相关代码如下:

后端代码

@app.expect(model)
def post(self):
    try: 
        formData = request.json
        formData = {"0": formData}
        print(formData)
        df_json = pipelineTransform(formData, headers_df)
        df_predict = reorder(df_json, headers_df)
        #data = [val for val in formData.values()]
        predictVal = classifier.predict_proba(df_predict)
        print(predictVal)
        #types = { 0: "Iris Setosa", 1: "Iris Versicolour ", 2: "Iris Virginica"}
        response = jsonify({
            "statusCode": 200,
            "status": "Prediction made",
            "result": "Probability of Heart Disease: " + predictVal + "%"
            })
        response.headers.add('Access-Control-Allow-Origin', '*')
        print(response)
        return response

Jupyter测试代码

json_str2 = '''{'Age': '62', 'Sex': 'M', 'Chestpain': 'ASY', 'RestingBP': '140', 'Cholesterol': '175', 'FastingBS': '0', 
'RestingECG': 'Normal', 'MaxHR': '205', 'ExerciseAngina': 'N', 'Oldpeak': '0', 'ST_slope': 'Up'}'''

df = pd.read_json(json_str2, orient='columns')

注:上述json_str2是后端formData打印输出的字符串。

错误原因

  1. JSON格式不规范:测试代码中的json_str2使用了单引号,但JSON标准要求键和字符串值必须用双引号,pd.read_json严格遵循JSON规范,因此无法解析单引号格式的字符串。
  2. 后端数据处理冗余:request.json已经是Flask自动解析后的Python字典,不需要将其包装为特殊格式再做转换,直接用字典构造DataFrame更高效且不易出错。

解决方案

1. 修正测试代码

方案一:修正JSON字符串格式

将单引号替换为双引号,符合JSON规范:

json_str2 = '''{"Age": "62", "Sex": "M", "Chestpain": "ASY", "RestingBP": "140", "Cholesterol": "175", "FastingBS": "0", 
"RestingECG": "Normal", "MaxHR": "205", "ExerciseAngina": "N", "Oldpeak": "0", "ST_slope": "Up"}'''

df = pd.read_json(json_str2, orient='columns')

方案二:直接用字典构造DataFrame

跳过字符串解析步骤,直接将Python字典转为DataFrame:

data_dict = {'Age': '62', 'Sex': 'M', 'Chestpain': 'ASY', 'RestingBP': '140', 'Cholesterol': '175', 'FastingBS': '0', 
'RestingECG': 'Normal', 'MaxHR': '205', 'ExerciseAngina': 'N', 'Oldpeak': '0', 'ST_slope': 'Up'}

df = pd.DataFrame([data_dict])

2. 修正后端代码

直接利用request.json返回的字典构造DataFrame,同时修复概率值拼接的报错问题:

@app.expect(model)
def post(self):
    try: 
        formData = request.json
        # 直接将请求字典转为DataFrame
        df_json = pd.DataFrame([formData])
        df_predict = reorder(df_json, headers_df)
        predictVal = classifier.predict_proba(df_predict)
        # 提取概率值并转为字符串(假设第二个值是患病概率)
        predictVal_str = str(round(predictVal[0][1] * 100, 2))
        response = jsonify({
            "statusCode": 200,
            "status": "Prediction made",
            "result": f"Probability of Heart Disease: {predictVal_str}%"
            })
        response.headers.add('Access-Control-Allow-Origin', '*')
        return response
    except Exception as e:
        # 增加异常捕获,返回错误详情
        return jsonify({
            "statusCode": 500,
            "status": "Error occurred",
            "error": str(e)
        })

内容的提问来源于stack exchange,提问作者Josh Mumford

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:05:21