[英]Flask-PyMongo - Object of type InsertOneResult is not JSON serializable
我有一個 api,我正在嘗試使用 Flask-Pymongo 存儲/發布用戶對象。
但是,我收到以下錯誤
文件“/home/kay/.local/share/virtualenvs/server-iT4jZt3h/lib/python3.7/site-packages/flask/json/i│ nit .py”,第321行,在jsonify中
│ dumps(data, indent=indent, separators=separators) + '\\n', │ File "/home/kay/.local/share/virtualenvs/server-iT4jZt3h/lib/python3.7/site-packages/flask/ json/ i│ nit .py”,第 179 行,轉儲
│ rv = _json.dumps(obj, **kwargs) │ File "/usr/lib/python3.7/json/ init .py", line 238, in dumps
│ **kw).encode(obj) │ File "/usr/lib/python3.7/json/encoder.py", line 201, in encode
│ chunks = list(chunks) │ File "/usr/lib/python3.7/json/encoder.py", line 438, in _iterencode │ o = _default(o) │ File "/home/kay/link/server/ src/run.py”,第 18 行,默認
│ return json.JSONEncoder.default(self, o) │ File "/usr/lib/python3.7/json/encoder.py", line 179, in default
│加注類型錯誤(f'Object類型{ö類名。}的“│類型錯誤:類型InsertOneResult的對象不是JSON序列化
應用程序/用戶/resource.py
from flask_restful import Resource
from flask import jsonify, request
from .repository import UsersRepository
from db import mongo
class UsersResource(Resource):
def __init__(self):
self.repository = UsersRepository()
def get(self):
data = {"Users": "Resource"}
res = data, 200
return res
def post(self):
req = request.get_json()
user = {
"email": req.get("email"),
"password": req.get("password")
}
result = mongo.db.users.insert_one(user)
return jsonify(result)
運行文件
from flask import Flask
from app import api_bp
from db import mongo
from bson.objectid import ObjectId
import json
import datetime
import os
class JSONEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, ObjectId):
return str(o)
if isinstance(o, set):
return list(o)
if isinstance(o, datetime.datetime):
return str(o)
return json.JSONEncoder.default(self, o)
def create_app(config_filename):
app = Flask(__name__)
app.config.from_object(config_filename)
app.register_blueprint(api_bp, url_prefix='/api')
mongo.init_app(app)
app.json_encoder = JSONEncoder
return app
# def logger():
# def database():
if __name__ == "__main__":
app = create_app("config")
app.run(host='0.0.0.0', port=8080, debug=True)
我相信按照之前的建議你可以找到答案。 但我想提供另一種簡化它的解決方案。
該解決方案假設安裝了pymongo
和flask
包:
from flask import Flask
from flask.json import JSONEncoder
from bson import json_util
from . import resources
# define a custom encoder point to the json_util provided by pymongo (or its dependency bson)
class CustomJSONEncoder(JSONEncoder):
def default(self, obj): return json_util.default(obj)
application = Flask(__name__)
application.json_encoder = CustomJSONEncoder
if __name__ == "__main__":
application.run()
從 bson 導入 json_util
獲取 json 輸入時使用 force=true :
您可以在插入 mongo 之前檢查字段是否為空。
我從這里找到的簡單解決方案是
類型錯誤:ObjectId('') 不是 JSON 可序列化的
響應-> bson 轉儲(searlization)-> json 加載(反序列化)
代碼如下:
from bson.json_util import dumps,RELAXED_JSON_OPTIONS
import json
def post(self,name):
dream = {'name':name , 'price' : 12.00 }
dreams.append(dream)
dreamDao.addDream(dream) #MongoDB Call to Insert Data
bs = dumps(dream,json_options=RELAXED_JSON_OPTIONS) #Now dream has Response Which will have ObjectId
return json.loads(bs) , 201
行TypeError: Object of type InsertOneResult is not JSON serializable
描述了這個問題。 insert_one()
返回一個InsertOneResult
對象,其中包含插入的 ID(如@styvane 的評論所建議的那樣)以及指示寫入是否被數據庫確認的標志。 其他操作有類似的結果對象,它們都不是 JSON 可序列化的。
Flask-PyMongo 的未來版本可能會添加幫助器來支持這一點,您可以按照https://github.com/dcrosta/flask-pymongo/issues/62添加想法和建議。
from flask_pymongo import Pymongo
import json
import pandas as pd
user = pd.DataFrame(user)
mongo.db.users.insert_one({'email':json.loads(user[0].to_json(orient='index')),
'password':json.loads(user[1].to_json(orient='index'))})
如果您的對象已經是 json,這將引發錯誤。 如果不是,它會將它們轉換為 json 並一次性加載它們。
您發布到服務器的內容似乎不是有效的 json 對象。 所以你應該調試你得到的東西。
class UsersResource(Resource):
def post(self):
# debug
print("request.args is {}".format(request.args))
print("request.form is {}".format(request.form))
print("request.data is {}".format(request.data))
req = request.get_json()
user = {
"email": req.get("email"),
"password": req.get("password")
}
result = mongo.db.users.insert_one(user)
return jsonify(result)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.