Python RestAPI操作MongoDB报错:Object of type set is not JSON serializable
解决TypeError: Object of type set is not JSON serializable错误
错误根源
你的代码里存在一处返回语句的写法错误,导致生成了set类型数据,而Flask的jsonify无法序列化集合类型:
return jsonify({"ID is not matching"})
在Python中,{"ID is not matching"}会被解析为包含单个字符串的集合(set),而非你预期的键值对字典。jsonify仅支持序列化JSON标准类型(字典、列表、字符串、数字等),集合不在其支持范围内,因此抛出序列化错误。
修复步骤
1. 修正错误的返回格式
将上述返回语句改为标准键值对字典格式,保持和其他错误返回的格式一致:
return jsonify({"Success": False, "message": "ID is not matching"})
2. 修正MongoDB更新操作的合理性
你的$push用法存在逻辑问题:$push用于向MongoDB的数组字段追加元素,但如果目标字段不是数组类型,执行时会报错。如果你的需求是覆盖字段值而非追加到数组,应使用$set操作符:
col.find_one_and_update( {'ID': input_data['ID']}, {'$set': { "Details1": input_data["Details1"], "data2": input_data["data2"], "data3": input_data["data3"], "data4": input_data["data4"] }} )
如果确实需要向数组字段追加元素(比如Details1是数组类型),确保每个字段对应数组结构即可,当前$push的多字段写法是合法的。
3. 添加更新成功后的响应
更新操作完成后,返回明确的成功提示:
return jsonify({"Success": True, "message": "User data updated successfully"})
修正后的完整代码片段
class datadetail(Resource): def post(self): input_data = request.get_json() if input_data is None: return jsonify({"Success": False , "message": "wrong input parameter"}) elif 'ID' not in input_data: return jsonify({"Success": False,"message":"ID missing"}) else: result = col.find_one({"ID" : input_data['ID']}) if not result: return jsonify({"Success": False, "message": "ID is not matching"}) else: col.find_one_and_update( {'ID': input_data['ID']}, {'$set': { "Details1": input_data["Details1"], "data2": input_data["data2"], "data3": input_data["data3"], "data4": input_data["data4"] }} ) return jsonify({"Success": True, "message": "User data updated successfully"})
内容的提问来源于stack exchange,提问作者Muhammad Nihal C
相关产品推荐
相关产品推荐

