TypeError类型set的对象在Python RestAPI中不可JSON序列化



我试图构建一个RestAPI来查找用户并更新mongodb中的新数据字段,但我在编译时遇到了错误,我得到了以下错误

抛出TypeError(f'Object of type {0 .class)名字。} 'TypeError:类型集合的对象不是JSON序列化的

以下代码是我的app.py文件

import requests
import json
from flask import Flask, jsonify, request 
from flask_restful import Resource, Api
from pymongo import MongoClient
app = Flask(__name__)
api = Api(app)
cluster = MongoClient("my cluster")
db  = cluster["my_db"]
col = db["user"]
class datadetail(Resource):
def post(self):
input_data = request.get_json()
if input_data == None:
return jsonify({"Sucess":False , "message": "wrong input parameter"})

elif 'ID' not in input_data:
return jsonify({"Sucess":False,"message":"ID missing"})
else:
result = col.find_one({"ID" : input_data['ID']})
if not result:
return jsonify({"ID is not matching"})
else:
col.find_one_and_update({'ID':input_data['ID']}, {'$push':{"Details1": input_data["Details1"],"data2": input_data["data2"] ,"data3": input_data["data3"] ,"data4": input_data["data4"]}})


api.add_resource(datadetail, '/datadetail')           
if __name__ == '__main__':
app.run(debug=True)

下面是我的input_data json结构:{"ID"dfghj"Details1"Details1"data2"xyz123"data3"data3"data4"data4"}

我认为你得到的错误是由于你试图序列化JSON不支持的'set'类型的对象。您可以通过将您试图序列化的对象的数据类型从'set'更改为'list'来修复此错误。您可以使用'list()'函数来完成此操作。

For example:
list(input_data["data4"])

修复

col.find_one_and_update({'ID':input_data['ID']}, {'$push':{"Details1": input_data["Details1"],"data2": input_data["data2"] ,"data3": input_data["data3"] ,"data4": list(input_data["data4"])}})

这将修复您的错误,并允许您正确地序列化数据。

有一个很酷的技巧可以从任何字典(或类似字典的结构)中生成json字符串。

请记住,在python中,您可以向字典传递任何类型,但对于json,只有str*可用(但有时不仅仅是字符串)

假设flask.jsonfy()json.dumps()几乎是一样的

操作系统。Environ返回关于Environ的所有信息。但是这个对象尽管看起来像dict但是它不是json可序列化的

import os
import json
# it is my case
env = os.environ
json.dumps(env)  # it causes error
# the solution is cast to dict all the objects:
env = os.environ
json.dumps(dict(**env))  # this doesn't have error

如果这没有帮助,您可以强制强制转换为字符串所有元素:

json.dumps({str(key): str(value) for key, value in your_dict.items()})
# or in your case 
flask.jsonify({str(key): str(value) for key, value in your_dict.items()})

希望有帮助。

最新更新