Tamim Fahed نشر 22 يونيو 2021 أرسل تقرير نشر 22 يونيو 2021 لدي استعلام يقوم بإجراء aggregation على المستندات الموجودة ضمن مجموعة. وأستطيع الحصول على النتيجة وطباعتها باستخدام print: print(resultOfQuery) ولا يوجد أي مشكلة في أي استعلام أقوم بتنفيذه لأنني أحصل على النتيجة وأستطيع طباعتها، لكن إذا حاولت إعادة النتيجة عن طريق return: return resultOfQuery يظهر لدي الخطأ التالي: TypeError: ObjectId('5f4351948e86c20b1d1c0d3c') is not JSON serializable لماذا يظهر هذا الخطأ فقط في return؟ وماهي الطريقة الصحيحة لإعادة النتائج؟ 1 اقتباس
0 Wael Aljamal نشر 22 يونيو 2021 أرسل تقرير نشر 22 يونيو 2021 المشكلة هنا تكمن في أن نمط البيانات ObjectId المعرف في mongo غير معرفه عليه عملية التسلسل serialization لذلك عليك تعريف طريقة التحويل الخاصة بك واستخدامها: from bson import ObjectId import json class JSONEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, ObjectId): return str(o) return json.JSONEncoder.default(self, o) res = json.dumps(DBResultMessage, cls=JSONEncoder) حيث أن هذه الدالة ستتعامل بشكل خاص مع النمط ObjectId وتحوله لسلسلة نصية قبل ترميزه على هيئة JSON 2 اقتباس
0 عبدالباسط ابراهيم نشر 22 يونيو 2021 أرسل تقرير نشر 22 يونيو 2021 يمكنك أيضاً استخدام المكتبة Pymongo عن طريق json_util كالتالي def parse_json(data): return json.loads(json_util.dumps(data)) # يمكنك استخدام هذه الدالة عند إرجاع البيانات اقتباس
0 عبدالله عبدالرحمن11 نشر 25 يونيو 2021 أرسل تقرير نشر 25 يونيو 2021 حل سريع لذلك هو عبر إستخدام دالة ()str كالآتي ObjectId = str(ObjectId('5f4351948e86c20b1d1c0d3c')) اما إذا كنت تستخدم Flask فيمكنك إستخدام دالة jsonify @app.route('/') def home(): docs = [] for doc in db.person.find(): doc.pop('_id') docs.append(doc) return jsonify(docs) أو يمكنك التحويل من BSOM الى JSON كالآتي from bson import json_util import json @app.route('/') def index(): for _ in "collection_name".find(): return json.dumps(i, indent=4, default=json_util.default) اقتباس
السؤال
Tamim Fahed
لدي استعلام يقوم بإجراء aggregation على المستندات الموجودة ضمن مجموعة.
وأستطيع الحصول على النتيجة وطباعتها باستخدام print:
print(resultOfQuery)
ولا يوجد أي مشكلة في أي استعلام أقوم بتنفيذه لأنني أحصل على النتيجة وأستطيع طباعتها، لكن إذا حاولت إعادة النتيجة عن طريق return:
return resultOfQuery
يظهر لدي الخطأ التالي:
TypeError: ObjectId('5f4351948e86c20b1d1c0d3c') is not JSON serializable
لماذا يظهر هذا الخطأ فقط في return؟ وماهي الطريقة الصحيحة لإعادة النتائج؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.