gpt4 book ai didi

python - 对象不是 JSON 可序列化的

转载 作者:IT老高 更新时间:2023-10-28 13:07:56 24 4
gpt4 key购买 nike

我在使用 Mongodb 和 Python (Flask) 时遇到了一些问题。

我有这个 api.py 文件,我希望所有请求和响应都使用 JSON 格式,所以我就这样实现了。

#
# Imports
#

from datetime import datetime
from flask import Flask
from flask import g
from flask import jsonify
from flask import json
from flask import request
from flask import url_for
from flask import redirect
from flask import render_template
from flask import make_response
import pymongo
from pymongo import Connection
from bson import BSON
from bson import json_util

#
# App Create
#

app = Flask(__name__)
app.config.from_object(__name__)

#
# Database
#

# connect
connection = Connection()
db = connection['storage']
units = db['storage']


#
# Request Mixins
#

@app.before_request
def before_request():
#before
return

@app.teardown_request
def teardown_request(exception):
#after
return


#
# Functions
#

def isInt(n):
try:
num = int(n)
return True
except ValueError:
return False

def isFloat(n):
try:
num = float(n)
return True
except ValueError:
return False

def jd(obj):
return json.dumps(obj, default=json_util.default)

def jl(obj):
return json.loads(obj, object_hook=json_util.object_hook)

#
# Response
#

def response(data={}, code=200):
resp = {
"code" : code,
"data" : data
}
response = make_response(jd(resp))
response.headers['Status Code'] = resp['code']
response.headers['Content-Type'] = "application/json"
return response


#
# REST API calls
#

# index
@app.route('/')
def index():
return response()

# search
@app.route('/search', methods=['POST'])
def search():
return response()

# add
@app.route('/add', methods=['POST'])
def add():
unit = request.json
_id = units.save(unit)
return response(_id)

# get
@app.route('/show', methods=['GET'])
def show():
import pdb; pdb.set_trace();
return response(db.units.find())

#
# Error handing
#

@app.errorhandler(404)
def page_not_found(error):
return response({},404)


#
# Run it!
#

if __name__ == '__main__':
app.debug = True
app.run()

这里的问题是来自 mongo 的 json 编码数据。看来我已经能够通过将 request.json 作为保存字典来“破解”添加路由,所以这很好......问题是/show。此代码不起作用...当我进行一些日志记录时,我得到了

TypeError: <pymongo.cursor.Cursor object at 0x109bda150> is not JSON serializable

有什么想法吗?我也欢迎对其余代码提出任何建议,但 JSON 让我很头疼。

提前致谢!

最佳答案

@ErenGüven 向您展示了一种很好的手动方法来解决这个 json 序列化问题,而 pymongo 带有 utility to accomplish this for you .我在自己的 django mongodb 项目中使用它:

import json
from bson import json_util

json_docs = []
for doc in cursor:
json_doc = json.dumps(doc, default=json_util.default)
json_docs.append(json_doc)

或者简单地说:

json_docs = [json.dumps(doc, default=json_util.default) for doc in cursor]

并再次从 json 中取回它们:

docs = [json.loads(j_doc, object_hook=json_util.object_hook) for j_doc in json_docs]

帮助实用程序告诉 json 如何处理自定义 mongodb 对象。

关于python - 对象不是 JSON 可序列化的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11280382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com