اذهب إلى المحتوى
  • 0

ظهور الخطأ ObjectId is not JSON serializable في mongo ضمن python

Tamim Fahed

السؤال

لدي استعلام يقوم بإجراء aggregation على المستندات الموجودة ضمن مجموعة. 

وأستطيع الحصول على النتيجة وطباعتها باستخدام print:

print(resultOfQuery)

ولا يوجد أي مشكلة في أي استعلام أقوم بتنفيذه لأنني أحصل على النتيجة وأستطيع طباعتها، لكن إذا حاولت إعادة النتيجة عن طريق return:

return resultOfQuery

يظهر لدي الخطأ التالي:

TypeError: ObjectId('5f4351948e86c20b1d1c0d3c') is not JSON serializable

لماذا يظهر هذا الخطأ فقط في return؟ وماهي الطريقة الصحيحة لإعادة النتائج؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

المشكلة هنا تكمن في أن نمط البيانات 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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك أيضاً استخدام المكتبة Pymongo عن طريق  json_util  كالتالي

def parse_json(data):
    return json.loads(json_util.dumps(data))
  
# يمكنك استخدام هذه الدالة عند إرجاع البيانات

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

حل سريع لذلك هو عبر إستخدام دالة ()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)

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...