python - 错误:TypeError:“int64”类型的对象不是 JSON 可序列化和 json.decoder.JSONDecodeError:预期值:第 1 行第 1 列(字符 0)
问题描述
我正在尝试使用 Flask 部署我的 ML 模型。但我收到了上述错误。下面的代码是鸢尾花数据集上的随机森林分类器。
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
加载数据集
iris = load_iris()
X = iris.data
y = iris.target
拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y ,
random_state = 1)
构建模型
clf = RandomForestClassifier(n_estimators=100,n_jobs=2)
训练分类器
clf.fit(X_train, y_train)
预测物种
predicted = clf.predict(X_test)
print(predicted)
检查准确性
print(accuracy_score(predicted, y_test))
import pickle as pickle
pickle.dump(clf,open("rfc.pkl","wb"))
my_rfc = pickle.load(open("rfc.pkl","rb"))
import requests
import json
url="http://127.0.0.1:8000/api"
data=json.dumps({'sl':5.5,'sw':3.2,'pl':3.7,'pw':1.2})
r=requests.post(url,data)
print (r.json())
烧瓶代码:
import numpy as np
from flask import Flask
from flask import abort
from flask import jsonify
from flask import request
import pickle as pickle
my_rfc = pickle.load(open("rfc.pkl","rb"))
app=Flask(__name__)
@app.route('/')
def index():
return "Iris prediction"
@app.route('/api',methods=['POST'])
def make_predict():
data=request.get_json(force=True)
data_request = [[data['sl'],data['sw'],data['pl'],data['pw']]]
data_request = np.array(data_request).reshape(1,4)
y_hat=my_rfc.predict(data_request)
output=[y_hat[0]]
return jsonify(results=output)
if __name__ == '__main__':
app.run(port=8000,debug=True)
错误:
回溯(最后一次调用):文件“new1.py”,第 40 行,打印中(r.json())文件“/home/saurabh/anaconda3/lib/python3.6/site-packages/requests/models. py”,第 896 行,在 json 中返回 complexjson.loads(self.text, **kwargs) 文件“/home/saurabh/anaconda3/lib/python3.6/json/init .py ”,第 354 行,在负载中返回 _default_decoder .decode(s) File "/home/ line 357, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
解决方案
如果 JSON 解码失败,r.json()
则会引发异常。例如,如果响应得到 204(无内容),或者如果响应包含无效的 JSON,则尝试r.json()
引发 ValueError: No JSON object could be decoded。
需要注意的是,调用成功r.json()
并不代表响应成功。某些服务器可能会在失败的响应中返回 JSON 对象(例如 HTTP 500 的错误详细信息)。这样的 JSON 将被解码并返回。要检查请求是否成功,请使用r.raise_for_status()
或检查r.status_code
您所期望的。
所以检查你的状态码如果它是 200 那么它应该解析 json 如果它是 204 那么 URL 有问题。检查它使用
print(r.status_code)
有关更多信息,请参阅此链接
推荐阅读
- java - 如何在 Couchbase 中捕获保存或更新事件
- servicestack - 自托管最大 URL 长度
- excel - VBA/Userform 中的偏移匹配函数
- ruby - Heroku:本地和 Heroku 上的不同 ruby 版本
- powershell - 在 PowerShell 中没有 \exe 参数的 sfttray \launch 的 App-V 5.0 替代方案是什么?
- spring-boot - SimpleMessageListenerContainer 使用 RetryOperationsInterceptor 订阅多个队列
- c# - 为什么 Windows 窗体设计器属性中的 BackColor 和 ForeColor Int32s,而设计器代码中的 Drawing.Colors?
- angular - 如何填充 Observable
- biztalk - BizTalk 映射 EDI N2 字段(在出站消息中)
- android - Kotlin 设置全局变量的值