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打印输出的字符串。
错误原因
- JSON格式不规范:测试代码中的
json_str2使用了单引号,但JSON标准要求键和字符串值必须用双引号,pd.read_json严格遵循JSON规范,因此无法解析单引号格式的字符串。 - 后端数据处理冗余:
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
相关产品推荐
相关产品推荐

